检查线程池是否有任何活动线程

本文关键字:线程 任何 活动 是否 检查 | 更新日期: 2023-09-27 17:57:21

我正在编写一个响应IMAP推送通知的Windows服务。收到通知后,我使用 ThreadPool 对用户工作项进行排队。(它调用的方法将一些东西放在数据库中等等)。

在某些时候,我想停止我的服务,这将阻止ThreadPool排队其他线程并等待,直到没有正在工作的打开线程。

//Pseudo code
public void StopService()
{
    while (true)
    {
        if (ThreadPool.ActiveThreads == 0)
        {
            //disconnect imap
            //stop service
        }
    }
}

更好的方法是告诉ThreadPool我希望收到通知它没有活动线程,这样我就不必在 while 循环中轮询它。

这个问题使用线程安全计数器,这是确定 ThreadPool 是否有任何打开线程的一种方法,但肯定必须有一个标志或 ThreadPool 类之外的某个方法/属性来确定这一点?

检查线程池是否有任何活动线程

我建议您将所有单独的工作项挂接到ManualResetEvent然后将ThreadPool中的所有工作项排队,然后调用WaitHandle.WaitAll(myResetEvents);等待所有工作项完成,然后关闭服务,依此类推。

程序流程

  1. 启动服务
  2. 开始聆听
  3. 排队工作项
  4. 停止侦听新项目
  5. 等待所有项目完成 -WaitHandle.WaitAll(allMyQueuedWorkitems)
  6. 停止服务