C#模式来防止事件处理程序挂钩两次
这个问题在这里已经有了答案:
显式实现该事件并检查调用列表。 您还需要检查空值:
using System.Linq; // Required for the .Contains call below:
...
private EventHandler foo;
public event EventHandler Foo
{
add
{
if (foo == null || !foo.GetInvocationList().Contains(value))
{
foo += value;
}
}
remove
{
foo -= value;
}
}
使用上面的代码,如果一个调用者多次订阅该事件,它将被简单地忽略。
如果只是首先用-=
删除事件,如果没有发现异常则不会抛出
/// -= Removes the event if it has been already added, this prevents multiple firing of the event
((System.Windows.Forms.WebBrowser)sender).Document.Click -= new System.Windows.Forms.HtmlElementEventHandler(testii);
((System.Windows.Forms.WebBrowser)sender).Document.Click += new System.Windows.Forms.HtmlElementEventHandler(testii);
我测试了每个解决方案,最好的(考虑性能)是:
private EventHandler _foo;
public event EventHandler Foo {
add {
_foo -= value;
_foo += value;
}
remove {
_foo -= value;
}
}
没有Linq使用需要。 在取消订阅之前不需要检查null(有关详细信息,请参阅MS EventHandler)。 无需记得到处取消订阅。
链接地址: http://www.djcxy.com/p/51487.html