如何显式事件访问器

时间:2014-03-18 11:54:46

标签: c# events

以下是明确事件评估员的草图:

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
    

2 个答案:

答案 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