代码之家  ›  专栏  ›  技术社区  ›  P.K

如何注销“匿名”事件处理程序[重复]

  •  36
  • P.K  · 技术社区  · 15 年前

    如果我在听一个事件:

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

    7 回复  |  直到 15 年前
        1
  •  43
  •   dtb    15 年前

    为匿名委托的实例指定一个名称:

    EventHandler<NewEventArg> handler = delegate(object sender, NewEventArgs e)
    {
        //some code
    };
    
    Subject.NewEvent += handler;
    Subject.NewEvent -= handler;
    
        2
  •  24
  •   Reed Copsey    15 年前

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

    在这种情况下,将其分配给本地方法会更好—您可以完全取消订阅事件。

        3
  •  22
  •   Ian    14 年前

    要在第一次调用时删除处理程序,请执行以下操作:

    //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;
    
        4
  •  6
  •   EKazakov    15 年前

        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);
                }
            }
        }
    }
    
        5
  •  2
  •   apiguy    15 年前

        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;
    
        6
  •  0
  •   Walt W    15 年前

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

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

        7
  •  0
  •   Community noseratio    7 年前

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

    但是现在, Reactive Framework