判断'elapsed'事件线程是否仍在运行?

时间:2008-10-29 05:15:58

标签: multithreading timer

给定一个System.Timers.Timer,是否有一种方法可以从主线程判断运行已用事件代码的工作线程是否仍在运行?

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

这是使用状态来消除线程计时器的问题,还是直接使用线程的时候?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

为了使其工作,您必须使用一种线程安全信令来检测操作是否已完成。

Timer Documentation