检查 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 不创建任何新线程

ThreadPool线程池

ThreadPool线程池

C# 相当于 Python 的 ThreadPool

C#的 Task,Thread,ThreadPool 之间有啥异同

Threadpool 如何重用线程以及它是如何工作的