检查 ThreadPool 是不是有任何活动线程
Posted
技术标签:
【中文标题】检查 ThreadPool 是不是有任何活动线程【英文标题】:Check if the ThreadPool has any active threads检查 ThreadPool 是否有任何活动线程 【发布时间】:2014-04-08 17:54:02 【问题描述】:我正在编写一个响应 IMAP 推送通知的 Windows 服务。收到通知后,我使用ThreadPool
将用户工作项排队。 (它调用的方法将一些东西放入数据库等)。
在某些时候,我想停止我的服务,这将阻止 ThreadPool
将其他线程排队并等待直到没有正在工作的打开线程。
//Pseudo code
public void StopService()
while (true)
if (ThreadPool.ActiveThreads == 0)
//disconnect imap
//stop service
更好的方法是告诉ThreadPool
我希望收到通知它没有活动线程,这样我就不必在while 循环中轮询它。
This question 使用线程安全计数器,这是确定 ThreadPool 是否有任何打开线程的一种方法,但肯定必须有一个标志或 ThreadPool
类之外的某些方法/属性来确定这一点?
【问题讨论】:
您正在运行的代码不会是线程池中的活动线程吗? 当然,为什么不呢?我写伪代码是有原因的,它是为了帮助可视化我写的内容。 嗯,我只是在想,这将是您永远不会进入if
声明并停止服务的原因。
【参考方案1】:
我建议您将所有单独的工作项连接到ManualResetEvent
,然后将所有工作项排队到ThreadPool
,然后调用WaitHandle.WaitAll(myResetEvents);
等待所有工作项完成,然后关闭您的服务中断等。
程序流程
-
启动服务
开始收听
队列工作项
停止收听新项目
等待所有项目完成 -WaitHandle.WaitAll(allMyQueuedWorkitems)
停止服务
【讨论】:
所以在停止服务方法中我应该做while(WaitHandle.WaitAll(...)) //stop service //return;
?
不,您会在某个时候停止侦听新请求,然后等待所有现有排队项目完成,然后调用您的关闭服务方法。查看更新程序流程的答案
哦,我明白了,我调用了停止服务方法,此时我停止收听,然后输入WaitHandle.WaitAll
,然后我的代码实际停止服务。看来,通过调用WaitAll
在完成之前不会执行它之后的代码。
是的,通过调用WaitAll()
,它会阻塞你的主线程,直到你排队的所有项目都完成。以上是关于检查 ThreadPool 是不是有任何活动线程的主要内容,如果未能解决你的问题,请参考以下文章
ThreadPool.SetMinThreads 不创建任何新线程