C#如何确保用户提供线程安全对象的功能

时间:2011-07-23 14:52:43

标签: c# .net-3.5 thread-safety

我有一个Server类,在接受TcpClient时,会引发一个事件,其主要工作是将用户定义的对象传递给属于TcpClient的线程。 e.g。

public class MyData : UserData {}
public GetUserDataEventArg : CancelEventArg { UserData Data { get; set; } }
public class Server { public event EventHandler<GetUserDataEventArg> GetUserData = null; }
// intended usage, each thread has its own data.
public void GetUserDataEventHandler1(object sender, GetUserDataEventArg e) { e.Data = new MyData(); } 
// dangerous usage, shared member data may not have thread safety implemented.
public void GetUserDataEventHandler2(object sender, GetUserDataEventArg e) { e.Data = m_myData; } 

如何确保使用是线程安全的?实现相同目标的其他实现受到欢迎。提前谢谢。

2 个答案:

答案 0 :(得分:3)

你无法编写代码来获取可以检查该对象的对象,以确定它是否是线程安全的。

因此,您必须在:

之间进行选择
  1. 假设 是线程安全的,将负担放在该对象的提供者身上,即。来电者
  2. 假设它不是线程安全的,给你带来负担,以线程安全的方式处理该对象
  3. 无论哪种方式,您都需要记录这一点,以便编写调用代码的人知道会发生什么,以及他的角色是什么。

答案 1 :(得分:2)

试试这个:

public class MyData
{
    private int _originatingThreadId;

    public MyData()
    {
        _originatingThreadId = Thread.CurrentThread.ManagedThreadId;
    }

    public void ThreadUnsafeMethod()
    {
        if(Thread.CurrentThread.ManagedThreadId != _originatingThreadId)
            throw new Exception("This method should only be called from the thread on which the original object was created");
    }
}

请记住,如果您在ASP.Net上下文中使用它,这将无效,因为请求可以使用称为“线程敏捷性”的东西,这意味着请求可能会在其生命周期中传递给其他线程