如何取消注册“匿名”事件处理程序[复制](How do I Unregister 'anon

2019-06-21 05:30发布

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

  • 退订匿名方法在C# 11的答案

说,如果我听的事件:

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

现在我该怎样取消注册此事件? 或者只是让内存泄漏?

Answer 1:

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

这是一个情况下,以本地方式分配,这是更好的 - 你可以从事件干净退订。



Answer 2:

给你的匿名委托的名称的实例:

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

Subject.NewEvent += handler;
Subject.NewEvent -= handler;


Answer 3:

要解除对第一次调用的处理程序:

//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;


Answer 4:

您可以从事件的所有监听器注销创建方法。 这不是你whant到底是什么,但有时也可以是有益的。 例如(这真的有用=)):

    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);
            }
        }
    }
}


Answer 5:

你需要一个名称为您的匿名函数,然后,你只能只要名字范围做到这一点:

    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;


Answer 6:

您是否需要取消其注册超过泄漏以外的原因?

关于“或仅允许内存泄漏”位,当被摄对象由垃圾收集清理,您的匿名委托应清理一样,所以不应该有泄漏。



Answer 7:

有(我的)另一个问题,其进入该部分(太多)细节: 与lambda表达式使用弱事件处理模型 。

不过,现在的无 框架已经出来了,我会认真考虑寻找到,在这种情况下。



文章来源: How do I Unregister 'anonymous' event handler [duplicate]