如果我监听一个事件:
Subject.NewEvent += delegate(object sender, NewEventArgs e)
{
//some code
});
那么我该如何取消注册此事件?或者让内存泄漏?
如果我监听一个事件:
Subject.NewEvent += delegate(object sender, NewEventArgs e)
{
//some code
});
那么我该如何取消注册此事件?或者让内存泄漏?
为匿名委托实例指定一个名称:
EventHandler<NewEventArg> handler = delegate(object sender, NewEventArgs e)
{
//some code
};
Subject.NewEvent += handler;
Subject.NewEvent -= handler;
IDisposable
中,就可以轻松清理所有事件处理程序。 - Enigmativity在第一次调用时移除处理程序:
//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;
您可以创建一个方法,用于取消注册所有事件的侦听器。这不完全是您想要的,但有时它可能会有所帮助。例如(这确实有效 =)):
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);
}
}
}
}
someClass.SomeEvent = null
,而不是遍历 InvocationList。 - einord 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;