c# - 保证一个类只能被实例化它的线程使用

标签 c# thread-safety

我创建了一个非线程安全的类,如果假设它是线程安全的,可能会导致严重的错误。当我努力使我的类线程安全时,我想让实例只能由一个线程使用。目前我的实现是在每个暴露点检查当前线程是否与用于构造实例的线程相同。

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/

相关文章:

c# - Bot 框架本地化语言

c# - 如何确保每个参数组合只执行一次方法逻辑?

c# - C#中变量之间的歧义

C# 从 URL 下载文件

Java 在使用前锁定变量赋值。为什么?

java - 可调用任务未正确执行

c# - 在 C# 中从线程更新 UI 的其他方法

c# - 多线程访问非静态类的静态对象

c# - 使用 LINQ 查询从列表中返回对象

c# - DataContractAttribute、IExtensibleDataObject、ExtensionDataObject 上的错误