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



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

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

我知道,每次称呼它时,它都会在调用线程上下文中运行,这对我来说还可以。我的两个问题是:

  1. 我需要保护一个vent处理程序吗?喜欢

    锁(某些对象({ 如果(一个vent!= null( 一个vent(稍微响应(;}

  2. 如果同时通过多个线程调用途径,并且处理程序只有线程安全代码(例如仅用于处理的本地变量(会发生什么。那可以在没有保护的情况下使用处理程序吗?

我需要保护一个vent处理程序吗?

,但这很容易:

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号,如果事件处理程序是线程安全的,则否,如果不是,则不是,但是最好将其锁定在处理程序中,而不是您称之为。对于2号,只要变量是本地的,它是线程安全的。

相关内容

  • 没有找到相关文章

最新更新