我可以停止System.Threading.Timer

Jef*_*nby 6 c# multithreading timer

我有一个应用程序,它使用计时器偶尔在辅助线程上运行监视任务.其中一些清理任务需要花费大量时间,我希望能够在用户结束程序时中止这些任务(如果可能的话,优雅地).

是否有任何方法可以使用Thread.Abort()以编程方式中止线程,或者我是否必须在代码中添加一个标志以指示线程已完成并在启动的代码中的有害位置检查通过计时器?

Bra*_*ner 5

您可以在使用回调执行之前停止计时器.change,但是一旦回调开始执行,您应该使用应用程序级别标志来允许您的代码退出.

作为旁注,你不应该使用,thread.abort()除非你完全100%确定你知道它将被留下的状态.它会以奇怪的方式严重破坏你的应用程序的稳定性.


Jar*_*Par 4

无法提前知道回调将Thread在哪一个上Threading.Timer运行。因此没有通用的方法来中止它。回调本身可以传达Thread实例进行通信,但它会引发一些竞争条件

注意:一般来说使用Abort是一种不好的做法。这是一种相当可靠的方法,最终会导致难以检测到的死锁和/或资源泄漏。最好使用像这样的被动机制CancellationToken