如何确保C#中只有一个事件处理程序

时间:2009-07-07 01:51:30

标签: c# refactoring event-handling

  

可能重复:
  How to ensure an event is only subscribed to once

有时候我想附加一个事件处理程序,但我不确定我是否已经完成了该事件。我的解决方法是使用 - =删除它,然后使用+ =添加它。还有更好的方法吗?

编辑:我想确保不做两次(或更多次)的原因是,如果我这样做,它会被解雇两次(或更多次)

3 个答案:

答案 0 :(得分:1)

删除事件然后添加事件的解决方案可能会在多线程场景中爆炸,您可以有效地最终添加重复项或排除异常。

您可以在活动中实施add and remove,但这有其自身的警告。

如果你真的只需要一个强制转换类型的动作,你可以考虑只传递一个Action并在需要时调用它,这可以节省你在事件中遇到的一些困难边缘情况。

答案 1 :(得分:0)

你试过这个:

public event MyClickHandler Click = delegate {}; // add empty delegate!

结帐详情:Hidden Features of C#?

答案 2 :(得分:0)

所以,我假设你不能控制引发事件的类,你不能在那里检查它。如果您需要运行时检查您是否已经在水槽侧注册了一个事件,您可以将注册集中在一个检查您是否已经注册的方法中,例如......

private void RegisterForEvent()
{
  lock( _registerLock )
  {
    if( !_iveDoneThisAlready )
    {
      _iveDoneThisAlready = true;
      // register for Event here
    }
  }
}

但是,您的代码必须同意该约定。没有任何事情迫使注册人调用此方法而不是+ =。