我有一个带某些事件处理程序的课程。该类创建几个可以使用这些处理程序的线程(如果分配了(。在伪代码中:
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);
}
}
我知道,每次称呼它时,它都会在调用线程上下文中运行,这对我来说还可以。我的两个问题是:
我需要保护一个vent处理程序吗?喜欢
锁(某些对象({ 如果(一个vent!= null( 一个vent(稍微响应(;}
如果同时通过多个线程调用途径,并且处理程序只有线程安全代码(例如仅用于处理的本地变量(会发生什么。那可以在没有保护的情况下使用处理程序吗?
我需要保护一个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号,只要变量是本地的,它是线程安全的。