我有一个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; }
如何确保使用是线程安全的?实现相同目标的其他实现受到欢迎。提前谢谢。
答案 0 :(得分: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上下文中使用它,这将无效,因为请求可以使用称为“线程敏捷性”的东西,这意味着请求可能会在其生命周期中传递给其他线程