c#-确保类只能由实例化它的线程使用
作者:互联网
我创建了一个不是线程安全的类,如果假定是线程安全的,则可能导致错误.当我努力使我的类成为线程安全的时,我想使实例只能由一个线程使用.当前,我的实现是检查当前线程是否与用于在每个暴露点构造实例的线程相同.
public class NotThreadSafeClass
{
private readonly int _creatorThreadId;
public NotThreadSafeClass()
{
_creatorThreadId = Thread.CurrentThread.ManagedThreadId;
}
public string ExposedProp
{
get
{
AssertSameThread();
return "My Prop";
}
}
public void ExposedMethod()
{
AssertSameThread();
/* Do stuff */
}
private void AssertSameThread()
{
Throw.If(_creatorThreadId != Thread.CurrentThread.ManagedThreadId,
@"NotThreadSafeClass is not thread safe. Please don't use
the same instance of NotThreadSafeClass in multiple threads.");
}
}
注意:Throw.If在http://www.codeducky.org/10-utilities-c-developers-should-know-part-one/中定义
这种模式似乎可以工作,但是如果开发人员忘记将此检查添加到任何新的公开信息中,那么它将很麻烦并且容易出错.有没有更安全和/或更优雅的方法来确保实例仅由一个线程使用?
解决方法:
我认为,除了使用AOP框架之外,您还必须像自己描述的那样“拦截”您自己的代码中对类的方法/属性的所有此类访问.
我在想Ninject’s Interception Extension或PostSharp
语言/框架没有内置任何功能.
干杯
标签:thread-safety,c 来源: https://codeday.me/bug/20191122/2055976.html