我创建了一个非线程安全的类,如果假设它是线程安全的,可能会导致严重的错误。当我努力使我的类线程安全时,我想让实例只能由一个线程使用。目前我的实现是在每个暴露点检查当前线程是否与用于构造实例的线程相同。
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
语言/框架中没有为此构建任何内容。
干杯
关于c# - 保证一个类只能被实例化它的线程使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22467419/