首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >判断'elapsed‘事件线程是否仍在运行?

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

Stack Overflow用户
提问于 2008-10-29 05:15:58
回答 2查看 538关注 0票数 1

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

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

这是不是放弃了线程计时器使用状态的计时器,或者只是直接使用线程的时候了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-10-29 07:06:19

查一下ManualResetEvent,因为它是专门为你想要的东西而设计的。

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

代码语言:javascript
复制
// 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();

如果你愿意,我可以给你更多的示例代码,但我基本上是从我一年前不得不这样做时读到的几篇文章中抄袭过来的。

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

代码语言:javascript
复制
...
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkerDelegate),
  myCustomObjectThatContainsAResetEvent);
票数 1
EN

Stack Overflow用户

发布于 2008-10-29 05:56:55

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

为了让它工作,你必须使用线程安全信号的方式来检测操作是否已经完成。

Timer Documentation

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/245866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档