Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有事件处理程序和多线程的C#类_C#_Multithreading_Event Handling - Fatal编程技术网

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

具有事件处理程序和多线程的C#类,c#,multithreading,event-handling,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

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

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);
   }
}
公共类测试
{
公共事件类事件;
公开考试()
{
对于(int i=0;i<10;i++)
新线程(多线程).Start();
}
///运行此命令的多个线程
私有void多线程()
{
字符串响应;
//一些代码
if(OnEvent!=null)
OnEvent(someString,out响应);
}
}
我知道每次调用OneEvent时,它都会在调用线程上下文中运行,这对我来说没关系。我的两个问题是:

  • 我需要保护OneEvent处理程序吗?像

    锁(某个对象) { if(OnEvent!=null) OnEvent(someString,out响应); }

  • 如果OnHandler同时被多个线程调用,并且该处理程序只有线程安全的代码(比如只有用于处理的局部变量),会发生什么情况。那么在没有保护的情况下使用处理程序可以吗


  • 对于数字1,如果事件处理程序是线程安全的,则为否;如果不是,则为是,但最好将其锁定在处理程序中,而不是调用它的位置。 对于数字2,只要变量是局部变量,它就是线程安全的

    我需要保护OneEvent处理程序吗

    是的,但这很简单:

    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;
    

    这些可能的复制品都符合您的要求。是否要同时引发多个事件,以及处理程序是否正确处理同时引发的事件。我们无法为您回答这两个问题。这是否回答了您的问题。您很少会看到公开事件的线程安全组件。事件本身不适合多线程环境。请遵循