2010-09-09 54 views
0

我有一個Windows服務,當它啓動時會產生大約60個線程。我使用Nagios進行常規監視,並且我有所有必要的例程將數據發送到Nagios。但是,我無法弄清楚如何獲得所有線程的總和,並確保它們都不會死機。在Windows服務中監視線程

基本上就是我想要做的是:

foreach(thread t in threadPool) 
{ 
    if(t.isAlive()) 
    { 
     PingHost(t.ThreadID); 
    } 
} 

它似乎並不像這應該是非常困難的,但我不知道從哪裏開始。

+0

你可以添加代碼到每個線程,將定期調用脈衝或以其他方式通知它仍然活着嗎? – 2010-09-09 17:52:22

回答

1

我建議將每個線程添加到以ManagedThreadId爲關鍵字的Dictionary<int, Thread>。然後將回調方法傳遞給每個線程,並在終止時返回其ManagedThreadId。回調然後從字典中移除線程並通知Nagios。

您可以使用線程的Name屬性獲取基本的描述性數據,也可以創建自定義對象以保存關於該流程的其他信息並將其存儲在字典中而不是線程中。

+0

這聽起來不錯。我剛剛創建了一個對象來存儲有關線程正在處理的進程的信息。我會嘗試一下字典的想法。 – 2010-09-09 18:17:20

+0

對於每個新線程,我將創建一個對象,其中包含我需要的所有信息,包括ManagedThreadID。是否有可能基於ManagedThreadID調用thread.IsAlive? – 2010-09-09 18:54:35

+0

IsAlive是線程對象的屬性。相反,將線程包含在您的信息對象中。 – 2010-09-09 19:20:18

1

只是一個評論,60是一個固定數量的很多線程。您可能需要考慮一個處理循環(即使它有自己的專用線程) - 調試更容易,可擴展性更強。

但是,如果你真的需要這個,一個選擇是...當線程啓動時,做一些共享計數器的互鎖增量。在線程完成其工作之前,執行一次互鎖遞減。

+0

不幸的是,我繼承了這個項目,並堅持使用線程。但我需要更多的信息,而不僅僅是線程的數量來確定發生了什麼。我需要將線程ID與線程正在工作的特定進程相關聯,然後在線程關閉時通知nagios。 – 2010-09-09 17:46:31

+0

是的,一個有60個線程的項目往往會經常被繼承。這真的是相當深遠的一端。修復真正的問題。 – 2010-09-09 19:36:48

0

如果您有一些關於線程編程的特殊需求,SmartThreadPool項目可能會讓您滿意。