c# - 如何防止定时器停止后执行功能
问题描述
在https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer.stop?view=netcore-3.1上,我们可以读取 Timer 执行的可以在 Timer Stop 之后执行的函数,因为它可能该 Stop 方法将在另一个线程上运行。
我不明白本文档中提出的解决方法,有人可以通过解释如何防止计时器在停止功能后执行来帮助我吗?
解决方案
一个相当简单的方法是获取一个锁,防止在事件处理程序运行时释放对象,并使用一个标志来确保在对象被释放后不运行滴答处理程序:
private bool disposed;
private object disposeLock = new object();
private void MyTimerTickHandler(){
lock(disposeLock){
if(disposed) return;
....
}
}
private void Dispose(){
lock(disposeLock){
disposed = true;
...
}
}
这将确保在对象被释放后,滴答处理程序的内容永远不会运行。但这也意味着 dispose 方法可能会阻塞,除非您小心,否则可能会导致死锁。可能可以避免锁定,但这将取决于滴答处理程序正在做什么。
推荐阅读
- r - RShiny中侧边栏和主面板的固定位置
- html - Bootstrap 4:如何修复我的项目以占用所有空间,即使是内容较少的项目?
- python - 在有向加权图中找到访问每个节点的最短路径,对重新访问节点和边没有限制
- php - 使用php时如何确保字段中的字符长度/设置长度设置为特定数字?
- python - 使用命名空间实现多租户 (Python 3+)
- feign - Feign RequestInterceptor 无法获取 httpRequestAttributs
- c++ - 这个模板声明有什么问题?
- java - android UI 元素的可见性没有改变
- javascript - websocket将图片推送到web端,canvas渲染过多导致页面崩溃
- docker - Gitlab CI 作业随机失败/通过