给定一个System.Timers.Timer,主线程有没有办法判断运行已用事件代码的工作线程是否仍在运行?
换句话说,在停止计时器或正在运行计时器的主应用程序/服务线程之前,如何确保在工作线程中运行的代码当前没有运行?
这是不是放弃了线程计时器使用状态的计时器,或者只是直接使用线程的时候了?
发布于 2008-10-29 07:06:19
查一下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-29 05:56:55
对于开箱即用的解决方案,没有办法。主要原因是运行TimerCallback函数的线程很可能仍然是活动的,即使运行回调的代码已经完成。TimerCallback由ThreadPool外的线程执行。当任务完成时,线程不会死亡,而是返回到队列中等待下一个线程池任务。
为了让它工作,你必须使用线程安全信号的方式来检测操作是否已经完成。
Timer Documentation
https://stackoverflow.com/questions/245866
复制相似问题