2012-08-14 87 views
0

通常情况下,匿名事件处理程序可以释放如下:如何释放事件处理程序

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

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

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

回答

0

有几件事情:

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

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