如何显式使用事件访问器
本文关键字:访问 事件 何显式 | 更新日期: 2023-09-27 17:50:43
下面是显式事件评估器的草图:
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
试试这个:
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;}
}
}
- 显然,这与标准实现之间的区别在于委托的使用不是线程安全的。我如何使这个线程安全?
参考Shai的回答
- 我如何允许这样的事情:
if (PriceChanged != null)... etc
不能,不能在eventandler声明级别上——这总是需要在调用this的代码中完成。举个例子:_priceChanged
为null的一个原因是,如果既没有调用add也没有调用remove,那么它们怎么能防止null异常呢?除非你想用一个虚拟的回调初始化你的委托集合,但那只是邪恶的。