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

时间:2014-04-08 17:54:03

标签: c# threadpool

我正在编写一个响应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类之外的标志或某些方法/属性来确定此?

1 个答案:

答案 0 :(得分:2)

我建议您将所有单个工作项连接到ManualResetEvent,然后在ThreadPool中排队所有工作项,然后致电WaitHandle.WaitAll(myResetEvents);等待所有工作项目已完成,然后关闭您的服务等。

计划流程

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