如何在 lambda 方法中解开 lambda 事件处理程序?
How do I unhook an lambda event handler inside the lambda method?
所以我查看了 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
中,以将计时器从自身上解开。
但是我无法编译代码,因为错误:
Use of unassigned local variable "handler"
我的 Timer
的 Elapsed
事件是否可以在我的计时器完成时解除挂钩?
拆分变量的声明和赋值,它将正常工作。
System.Timers.ElapsedEventHandler handler = null;
handler = ((sender, args)
=>
{
aTimer.Elapsed -= handler;
wc.CancelAsync();
});
变量捕获的工作方式handler
事件触发时不会为空,它将是匿名委托。
所以我查看了 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
中,以将计时器从自身上解开。
但是我无法编译代码,因为错误:
Use of unassigned local variable "handler"
我的 Timer
的 Elapsed
事件是否可以在我的计时器完成时解除挂钩?
拆分变量的声明和赋值,它将正常工作。
System.Timers.ElapsedEventHandler handler = null;
handler = ((sender, args)
=>
{
aTimer.Elapsed -= handler;
wc.CancelAsync();
});
变量捕获的工作方式handler
事件触发时不会为空,它将是匿名委托。