37

假设我监听一个事件:

Subject.NewEvent += delegate(object sender, NewEventArgs e)
{
    //some code
}); 

现在如何取消注册此活动?或者只是让内存泄漏?

4

7 回答 7

43

为您的匿名委托实例命名:

EventHandler<NewEventArg> handler = delegate(object sender, NewEventArgs e)
{
    //some code
};

Subject.NewEvent += handler;
Subject.NewEvent -= handler;
于 2009-08-28T16:40:05.343 回答
25

如果您需要注销事件,我建议避免事件处理程序的匿名委托。

这是将其分配给本地方法更好的一种情况 - 您可以干净地取消订阅事件。

于 2009-08-28T16:38:35.830 回答
22

要在第一次调用时删除处理程序:

//SubjectType Subject = ..... already defined if using (2)

EventHandler handler = null;
handler = delegate(object sender, EventArgs e)
{
    // (1)
    (sender as SubjectType).NewEvent -= handler;
    // or
    // (2) Subject.NewEvent -= handler;

    // do stuff here
};

Subject.NewEvent += handler;
于 2010-05-26T18:34:45.893 回答
6

您可以创建从所有事件侦听器注销的方法。这并不完全是您想要的,但有时它可能会有所帮助。例如(这确实有效=)):

    class Program {
    static void Main(string[] args) {
        A someClass = new A();
        someClass.SomeEvent += delegate(object sender, EventArgs e) {
            throw new NotImplementedException();
        };

        someClass.ClearEventHandlers();
        someClass.FireEvent();

        Console.WriteLine("No error.");
    }

    public class A {
        public event EventHandler SomeEvent;

        public void ClearEventHandlers() {
            Delegate[] delegates = SomeEvent.GetInvocationList();
            foreach (Delegate delegate in delegates) {
                SomeEvent -= (EventHandler) delegate;
            }
        }

        public void FireEvent() {
            if (SomeEvent != null) {
                SomeEvent(null, null);
            }
        }
    }
}
于 2009-08-28T16:48:23.160 回答
2

您需要匿名函数的名称,然后,只要名称在范围内,您就可以这样做:

    var handler = new EventHandler(delegate(object o, EventArgs e)
    {
        //do something...
    };

    Subject.NewEvent += handler;

    // later on while handler is still in scope...

    Subject.NewEvent -= handler;
于 2009-08-28T16:50:53.420 回答
0

您是否需要出于泄漏以外的原因取消注册?

关于“或者只是允许内存泄漏”位,当垃圾收集器清理主题时,你的匿名委托也应该被清理,所以不应该有泄漏。

于 2009-08-28T16:37:18.580 回答
0

还有另一个(我的)问题在一些(太多)细节中涉及到这个问题:Weak event handler model for use with lambdas

但是,既然反应式 框架已经问世,我会认真考虑在这种情况下进行调查。

于 2010-09-15T11:57:00.700 回答