如何释放事件处理程序

时间:2012-08-14 19:08:43

标签: c# asynchronous

通常,匿名事件处理程序可以按如下方式发布:

    EventHandler hdl = null;
    hdl += (ss,ee) =>
    {
       //....
       MyObj.Completed -= hdl;            
       hdl = null;
    };

    MyObj.Completed += hdl;            
    MyObj.AsyncCall();

我的问题是:最新版本的C#需要hdl = null;吗?此版本还有更简单的解决方案或更简单的语法吗?

2 个答案:

答案 0 :(得分:0)

一些事情:

  1. 简单地设置hdl = null将不会释放您的处理程序以进行垃圾收集,因为MyObj.Completed仍将保留对处理程序的引用。 (但MyObj.Completed -= hdl在这种情况下会照顾它,所以你应该没问题。)
  2. 您不必在hdl的作业中使用+=。您应该使用简单的作业=
  3. 如果您的lambda是一个命名方法,则可以使用MyObj.Completed += MyCallbackNameMyObj.Completed -= MyCallbackName。如果您需要在闭包中捕获的东西,这不起作用,但我没有从您的示例中看到。

答案 1 :(得分:0)

不,不是必需的。这基本上都与捕获上下文(编译器生成的类)相关联;一旦事件被取消订阅,任何东西都不会将捕获上下文保留在范围内,因此它将有资格进行垃圾回收。擦除变量hdl(实际上是捕获上下文中的字段)没有任何好处(但没有真正的伤害)。