C#模式来防止事件处理程序挂钩两次

这个问题在这里已经有了答案:

  • 如何确保一次活动只订阅了6次答案

  • 显式实现该事件并检查调用列表。 您还需要检查空值:

    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

    上一篇: C# pattern to prevent an event handler hooked twice

    下一篇: Understanding events and event handlers in C#