以下是明确事件评估员的草图:
delegate void EventHandler (SomeObject m, EventArgs e);
EventHandler _priceChanged; //Private Delegate
public event EventHandler PriceChanged
{
add {_priceChanged += value;}
remove {_priceChanged -= value;}
}
显然,这与标准实现之间的区别在于委托的使用不是线程安全的。如何使这个线程安全?
我如何允许以下内容:
if (PriceChanged != null)... etc
答案 0 :(得分:1)
试试这个:
delegate void EventHandler (SomeObject m, EventArgs e);
EventHandler _priceChanged; //Private Delegate
private Object _myLock = new Object();
public event EventHandler PriceChanged
{
add {
lock(_myLock)
{_priceChanged += value;}
}
remove {
lock(_myLock)
{_priceChanged -= value;}
}
}
答案 1 :(得分:1)
- 显然,这与标准实现之间的区别在于委托的使用不是线程安全的。如何使这个线程安全?
请参阅Shai的回答。
- 我如何允许以下内容:
if (PriceChanged != null)... etc
你不能,而不是在事件处理程序声明级别 - 这总是需要在调用它的代码中完成。
举一个例子:_priceChanged
为空的一个原因是,如果既没有调用也没有删除 - 那么它们怎么能阻止空异常呢?除非你想用虚拟回调初始化你的委托集合,否则这只是邪恶的。
如果您想要替代方案,请查看reactive extensions。