c#如何确保用户为函数提供线程安全的对象

本文关键字:函数 线程 安全 对象 用户 何确保 确保 | 更新日期: 2023-09-27 18:03:07

我有一个服务器类,在接受TcpClient时,引发一个事件,其主要任务是获得一个用户定义的对象,将其传递到属于TcpClient的线程中。例如

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; } 

如何确保使用是线程安全的?我们欢迎实现相同目标的其他实现。

c#如何确保用户为函数提供线程安全的对象

你不可能编写接受一个对象的代码来检查该对象是否线程安全。

因此,您必须在以下选项中做出选择:

    假设它线程安全的,把负担放在该对象的提供者,即。调用者
  1. 假设它不是线程安全的,把负担放在你身上,以线程安全的方式处理该对象

无论哪种方式,您都需要对此进行记录,以便编写调用代码的人知道会发生什么,以及他在其中的角色。

试试这个:

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上下文,因为请求可以利用所谓的"线程敏捷性",这意味着请求可以在其生命周期中传递给不同的线程。