Pet*_*etr 11 c# events event-handling
在MSDN上,我发现以下内容:
public event EventHandler<MyEventArgs> SampleEvent;
public void DemoEvent(string val)
{
// Copy to a temporary variable to be thread-safe.
EventHandler<MyEventArgs> temp = SampleEvent;
Run Code Online (Sandbox Code Playgroud)
它是参考吗?
如果是这样,我不理解其含义,因为当SampleEvent变为null时,temp也是如此
if (temp != null)
temp(this, new MyEventArgs(val));
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 12
这是与线程有关的偏执狂.如果另一个线程在您检查完它之后取消订阅最后一个处理程序null,它可能会变成 null并且您将导致异常.由于委托是不可变的,因此将委托的快照捕获到变量中会阻止这种情况发生.
当然,它确实有另一个副作用,你可以(而不是)最终提升事件对一个认为已经取消订阅的对象......
但要强调 - 当多个线程订阅/取消订阅对象时,这只是一个问题,这是:罕见,而b:不完全合乎需要.