首页 > 解决方案 > 如何防止定时器停止后执行功能

问题描述

https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer.stop?view=netcore-3.1上,我们可以读取 Timer 执行的可以在 Timer Stop 之后执行的函数,因为它可能该 Stop 方法将在另一个线程上运行。

我不明白本文档中提出的解决方法,有人可以通过解释如何防止计时器在停止功能后执行来帮助我吗?

标签: c#timer

解决方案


一个相当简单的方法是获取一个锁,防止在事件处理程序运行时释放对象,并使用一个标志来确保在对象被释放后不运行滴答处理程序:

private bool disposed;
private object disposeLock = new object();

private void MyTimerTickHandler(){
    lock(disposeLock){
         if(disposed) return;
         ....
    }
}

private void Dispose(){
    lock(disposeLock){
        disposed = true;
        ...
    }
}

这将确保在对象被释放后,滴答处理程序的内容永远不会运行。但这也意味着 dispose 方法可能会阻塞,除非您小心,否则可能会导致死锁。可能可以避免锁定,但这将取决于滴答处理程序正在做什么。


推荐阅读