带有事件处理程序和多个线程的C#类

时间:2018-02-26 17:30:00

标签: c# multithreading event-handling

我有一个带有一些事件处理程序的类。该类创建了几个可以使用这些处理程序的线程(如果已分配)。在伪代码中:

public class Test
{
    public SomeEventKind OnEvent;
    public Test()
    {
        for (int i = 0; i < 10; i++)
            new Thread(multiThreaded).Start();
    }

   /// several threads running this
   private void multiThreaded()
   {
       string response;
      //some code
      if (OnEvent != null)
         OnEvent(someString, out response);
   }
}

据我所知,每次调用OnEvent时,它都将在调用线程上下文中运行,这对我来说没问题。我的两个问题是:

  1. 我是否需要保护OnEvent处理程序?喜欢

    lock(someObject) {     if(OnEvent!= null)         OnEvent(someString,out response); }

  2. 如果同时由多个线程调用OnHandler并且处理程序只有线程安全代码(比如只处理局部变量)会发生什么。可以使用没有保护的处理程序吗?

2 个答案:

答案 0 :(得分:0)

<块引用>

我需要保护 OnEvent 处理程序吗?

是的,但这很简单:

OnEvent?.Invoke(someString, out response);

或者这个:

var temp = OnEvent;
if (temp != null)
    temp(someString, out response)
<块引用>

那么在没有保护的情况下使用处理程序可以吗?

//This could evaluate to true here
if (OnEvent != null)
    //And then throw null ref exception here
    OnEvent(someString, out response);

旁注,这是一个委托,而不是一个事件。这是一个事件:

public event SomeDelegateType OnEvent;

答案 1 :(得分:-1)

对于数字 1,如果事件处理程序是线程安全的,则否,如果不是,则是,但最好将其锁定在处理程序中,而不是您调用它的地方。 对于数字 2,只要变量是本地的,它就是线程安全的。