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

C# 检查事件处理程序是否存在,c#,event-handling,C#,Event Handling,接下来,从-当我只希望触发一个处理程序事件时,使用-=然后+=方法的缺点是什么 _value.PropertyChanged -= _handlerMethod; _value.PropertyChanged += _handlerMethod; 这并不保证只触发一个处理程序 另一个位置可能会多次订阅事件的处理程序。在这种情况下,您将只删除第一个处理程序调用 通过检查事件的调用列表,如果您确实希望一次只订阅一个处理程序,则可以保证此行为。这里的想法是,如果未分配事件处理程序,则-=运算符不会执

接下来,从-当我只希望触发一个处理程序事件时,使用
-=
然后
+=
方法的缺点是什么

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

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

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


通过检查事件的调用列表,如果您确实希望一次只订阅一个处理程序,则可以保证此行为。

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

我个人不喜欢这种方法,我认为您应该真正致力于重构代码,以便知道事件处理程序只分配一次

缺点是: -如果您的应用程序是多线程的,并且在未分配处理程序时触发事件,则可能出现争用情况 -我也不确定在已经分配了两个处理程序副本的情况下运行_value.PropertyChanged-=\u handler方法时会发生什么。
-凌乱的代码-显然,从代码中不清楚哪个类以及何时侦听事件

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

作为旁注,这两行也不会影响已添加的任何其他处理程序。我相信这两个语句的唯一影响是可能对附加的处理程序进行重新排序。您只需保证在调用列表的末尾有一个_handlerMethod(尽管规范不保证排序),而不是保证其中没有其他实例。如何在运行时检查调用列表(c#)?请参阅您引用的文章中的第一个答案。基本上,您可以使用Delegate.GetInvocationList()来获取一个委托数组(即被调用的方法)。然后您可以直接检查它们。您还可以覆盖事件的添加/删除处理程序,以保证单个方法实例(总数不超过一个,或每个委托一个,等等)。见: