2014-04-08 130 views
0

我在写一个响应IMAP推送通知的Windows服务。收到通知时,我使用ThreadPool排队用户工作项目。 (它调用的方法把一些东西放入数据库等等)。检查线程池是否有任何活动线程

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

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

更妙的是一种方式来告诉大家,我想通知它没有活动线程,这样我就不必轮询它在一个while循环的ThreadPool

This question使用线程安全计数器是一种方法来确定线程池是否有任何打开的线程,但肯定必须有一个标志或ThreadPool类的某些方法/属性来确定此?

+0

那不是你正在运行的代码可以在活动线程线程池? – krillgar

+0

当然,为什么不呢?我写了Pseudo代码是为了一个理由,它是为了帮助我想象我写的东西。 –

+0

嗯,我只是想,这将是你永远不会进入你的'if'声明并停止服务的原因。 – krillgar

回答

2

我建议你钩出来你的个人工作项目到ManualResetEvent然后排队在ThreadPool所有的工作项目,然后调用WaitHandle.WaitAll(myResetEvents);要等到所有的工作项目是否齐全,然后关闭服务下来,等。

程序流

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

因此,在停止服务方法中,我应该'while(WaitHandle.WaitAll(...)){//停止服务//返回;}'? –

+0

不,您会停止在某个时候侦听新请求,然后等待所有现有的排队项目完成,然后调用您的关闭服务方法。看到更新的程序流程的答案 –

+0

哦,我看到了,我打电话给停止服务方法,在那时我停止听,然后把'WaitHandle.WaitAll',然后我的代码实际上停止服务。看起来,通过调用'WaitAll'将不会执行后面的代码,直到完成。 –

相关问题