c# - 如何在 lambda 方法中解开 lambda 事件处理程序?

标签 c# timer eventhandler

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

例如我有一个计时器:

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 中,以将计时器从自身上解开。

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

Use of unassigned local variable "handler"

当我的计时器完成时,是否可以解除我的 TimerElapsed 事件?

最佳答案

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

System.Timers.ElapsedEventHandler handler = null;

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

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

关于c# - 如何在 lambda 方法中解开 lambda 事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30621099/

相关文章:

c# - 安全地将密码从 C# 传输到 Java 应用程序

c# - 从代码隐藏动态访问 Storyboard?

c++ - 在 C++ 代码中指定的特定等待时间后执行某些操作?

java定时器用按钮改变延迟

JavaFX KeyEvent 未触发

android - PropertyChangedEventHandler 导致内存泄漏

JavaScript 事件监听器与事件处理程序

c# - 自动滚动控件(WinAPI)?

c# - 以编程方式定义 DataGridView 列类型

c - 如何解决 linux 定时器错误?