这个问题已经在这里有一个答案:
- 退订匿名方法在C# 11的答案
说,如果我听的事件:
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;
要解除对第一次调用的处理程序:
//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;
您可以从事件的所有监听器注销创建方法。 这不是你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);
}
}
}
}
你需要一个名称为您的匿名函数,然后,你只能只要名字范围做到这一点:
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;
您是否需要取消其注册超过泄漏以外的原因?
关于“或仅允许内存泄漏”位,当被摄对象由垃圾收集清理,您的匿名委托应清理一样,所以不应该有泄漏。
有(我的)另一个问题,其进入该部分(太多)细节: 与lambda表达式使用弱事件处理模型 。
不过,现在的无 框架已经出来了,我会认真考虑寻找到,在这种情况下。