如何解开lambda方法中的lambda事件处理程序?

时间:2015-06-03 13:10:10

标签: c# timer eventhandler

所以我查看了SO并找到了解除匿名事件处理程序的方法,这没问题。但我遇到的问题是如何解开事件处理程序本身实例中的事件处理程序。

例如我有一个计时器:

System.Timers.Timer aTimer = new System.Timers.Timer();
System.Timers.ElapsedEventHandler handler = ((sender, args)
  =>
  {
      //aTimer.Elapsed -= handler;
      wc.CancelAsync();
  });
aTimer.Elapsed += handler;
aTimer.Interval = 100000;
aTimer.Enabled = true;

随着这条线被注释掉,这很好用。但后来我意识到可能存在内存泄漏,因为ElapsedEventHandler永远不会被解开。因此,我尝试将注释掉的行添加到ElapsedEventHanlder以取消定时器。

但由于错误,我无法编译代码:

  

使用未分配的局部变量" handler"

当我的计时器完成时,是否可以取消Elapsed Timer事件的发送?

1 个答案:

答案 0 :(得分:4)

拆分变量和变量的赋值,它将正常工作。

System.Timers.ElapsedEventHandler handler = null;

handler = ((sender, args)
  =>
  {
      aTimer.Elapsed -= handler;
      wc.CancelAsync();
  });

当事件触发时,变量捕获的工作方式handler不会为空,它将是匿名委托。