2014-04-08 63 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'將不會執行後面的代碼,直到完成。 –

相關問題