1

给定一个 System.Timers.Timer,有没有办法从主线程判断运行经过的事件代码的工作线程是否仍在运行?

换句话说,在停止计时器或计时器正在运行的主应用程序/服务线程之前,如何确保工作线程中运行的代码当前没有运行?

这是放弃使用状态的线程定时器的问题,还是直接使用线程的时间?

4

2 回答 2

1

查找 ManualResetEvent,因为它专门用于执行您的要求。

您的线程创建一个新的重置事件,并将其添加到一个可访问的队列中,您的主线程可以使用该队列来查看是否有任何线程仍在运行。

// main thread owns this
private List<ManualResetEvent> _resetEvents;
...
// main thread does this to wait for executing threads to finish
WaitHandle.WaitAll(_resetEvents.ToArray(), 2000, false)
...
// worker threads do this to signal the thread is done
myResetEvent.Set();

如果您愿意,我可以为您提供更多示例代码,但我基本上只是从大约一年前我不得不这样做时阅读的几篇文章中复制它。


忘了提一下,您不能将此功能添加到计时器触发时将获得的默认线程。所以你应该让你的计时器处理程序非常精简,除了准备和启动一个新的工作线程之外什么都不做。

...
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkerDelegate),
  myCustomObjectThatContainsAResetEvent);
于 2008-10-29T07:06:18.823 回答
0

对于开箱即用的解决方案,没有办法。主要原因是运行 TimerCallback 函数的线程很可能仍然活着,即使运行回调的代码已经完成。TimerCallback 由线程池外的线程执行。当任务完成时,线程不会死亡,而是回到队列中等待下一个线程池任务。

为了让它工作,您将不得不使用一种线程安全的信号方式来检测操作是否已完成。

计时器文档

于 2008-10-29T05:56:54.580 回答