检查是否存在事件处理程序

时间:2009-11-23 17:12:00

标签: c# event-handling

this post开始 - 当我只想要触发一个处理程序事件时,使用-=然后+=方法时有什么不利之处?

_value.PropertyChanged -= _handlerMethod;
_value.PropertyChanged += _handlerMethod;

3 个答案:

答案 0 :(得分:4)

这并不能保证只触发一个处理程序。

另一个位置可能会多次为您的事件订阅您的处理程序。在这种情况下,您只会删除第一个处理程序调用。

通过检查事件的调用列表,您可以保证这种行为,如果您真的只想要一次订阅一个处理程序。

答案 1 :(得分:2)

如果您确实只想要执行一个处理程序,那么您可能希望使用适当委托类型的可设置属性而不是事件。只存储一名代表;你可以像处理事件处理程序那样执行委托。

答案 2 :(得分:1)

这里的想法是,如果没有分配事件处理程序, - =运算符将不会执行任何操作。

我个人并不喜欢这种方法,我认为你的目标应该是重构代码,以便知道事件处理程序只被分配一次。

缺点是:   - 竞争条件的可能性,如果您的应用程序是多线程的,并且在未分配处理程序时触发事件   - 我也不确定当你已经分配了两个处理程序副本时运行_value.PropertyChanged - = _handlerMethod会发生什么。   - 凌乱的代码 - 显然从代码中清楚地看出哪个类以及何时正在监听事件