定时器停止后如何防止执行函数
How to prevent executing function after Timer Stop
在 https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer.stop?view=netcore-3.1 上,我们可以读取 Timer 执行的函数,该函数可以在 Timer Stop 之后执行,因为 Stop 方法可能会 运行 在另一个线程上。
我不明白此文档中提供的解决方法,有人可以帮助我解释如何防止计时器在 Stop 函数后执行吗?
一个相当简单的方法是锁定,防止对象在事件处理程序 运行ning 时被释放,以及一个标志以确保 tick-handler 不会 运行处理对象后:
private bool disposed;
private object disposeLock = new object();
private void MyTimerTickHandler(){
lock(disposeLock){
if(disposed) return;
....
}
}
private void Dispose(){
lock(disposeLock){
disposed = true;
...
}
}
这将确保 tick 处理程序的内容永远不会在对象被释放后 运行s。但这也意味着 dispose 方法可能会阻塞,除非您小心,否则可能会导致死锁。可能可以避免锁定,但这取决于滴答处理程序正在做什么。
在 https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer.stop?view=netcore-3.1 上,我们可以读取 Timer 执行的函数,该函数可以在 Timer Stop 之后执行,因为 Stop 方法可能会 运行 在另一个线程上。
我不明白此文档中提供的解决方法,有人可以帮助我解释如何防止计时器在 Stop 函数后执行吗?
一个相当简单的方法是锁定,防止对象在事件处理程序 运行ning 时被释放,以及一个标志以确保 tick-handler 不会 运行处理对象后:
private bool disposed;
private object disposeLock = new object();
private void MyTimerTickHandler(){
lock(disposeLock){
if(disposed) return;
....
}
}
private void Dispose(){
lock(disposeLock){
disposed = true;
...
}
}
这将确保 tick 处理程序的内容永远不会在对象被释放后 运行s。但这也意味着 dispose 方法可能会阻塞,除非您小心,否则可能会导致死锁。可能可以避免锁定,但这取决于滴答处理程序正在做什么。