【问题标题】: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 声明并停止服务的原因。

标签: c# threadpool


【解决方案1】:

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

程序流程

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

【讨论】:

  • 所以在停止服务方法中我应该做while(WaitHandle.WaitAll(...)){ //stop service //return;}?
  • 不,您会在某个时候停止侦听新请求,然后等待所有现有排队项目完成,然后调用您的关闭服务方法。查看更新程序流程的答案
  • 哦,我明白了,我调用了停止服务方法,此时我停止收听,然后输入WaitHandle.WaitAll,然后我的代码实际停止服务。看来,通过调用WaitAll 在完成之前不会执行它之后的代码。
  • 是的,通过调用WaitAll(),它会阻塞你的主线程,直到你排队的所有项目都完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多