如何在lambda方法中解钩lambda事件处理程序

本文关键字:lambda 事件处理 程序 方法 | 更新日期: 2023-09-27 17:52:54

所以我看了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"的使用

是否有可能解除我的TimerElapsed事件当我的定时器完成?

如何在lambda方法中解钩lambda事件处理程序

将变量的声明和赋值分开,它将正常工作。

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

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