我有一个带有一些事件处理程序的类。该类创建了几个可以使用这些处理程序的线程(如果已分配)。在伪代码中:
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时,它都将在调用线程上下文中运行,这对我来说没问题。我的两个问题是:
我是否需要保护OnEvent处理程序?喜欢
lock(someObject) { if(OnEvent!= null) OnEvent(someString,out response); }
如果同时由多个线程调用OnHandler并且处理程序只有线程安全代码(比如只处理局部变量)会发生什么。可以使用没有保护的处理程序吗?
答案 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,只要变量是本地的,它就是线程安全的。