具有事件处理程序和多线程的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时,它都会在调用线程上下文中运行,这对我来说没关系。我的两个问题是:
对于数字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;
这些可能的复制品都符合您的要求。是否要同时引发多个事件,以及处理程序是否正确处理同时引发的事件。我们无法为您回答这两个问题。这是否回答了您的问题。您很少会看到公开事件的线程安全组件。事件本身不适合多线程环境。请遵循