在C#语言的书中谈到“引发事件”时有下面一段代码,以下是部分原文和代码,请帮我分析一下。

来源:百度知道 编辑:UC知道 时间:2024/05/27 07:10:40
若要避免争用条件,在执行空检查和引发事件之前,事件源还应创建事件的一个副本,例如:
private void RaiseTestEvent()
{
//Safely invoke an event:
TestEventDelegate temp=TestEvent;

if(temp!=null)
{
temp(this,new System.EventArgs());
}
}

它在担心线程安全的问题
代码应该象下面的:
delegate void TestEventDelegate(object sender,EventArgs e);
evnet TestEventDelegate TestEvent{
add{...}
remove{...}
}
...
void SomeAsycnMethod(){
....
RaiseTestEvent();
}

其实默认定义的事件都是线程安全的,
public event SomeDelegateHandler SomeEvent;

除非你自己要定义非线程安全的事件,(^_^)
public event SomeDelegateHandler SomeEvnet{
add{ ...}
remove{...}
}

你也可以:
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
public event SomeDelegateHandler SomeEvnet{
add{ ...}
remove{...}
}

TestEventDelegate是委托类吧,如果temp事件不为空则引发事件temp