2012-06-21 57 views
0

我注意到,在我的許多服務中(使用多個線程)線程ID不斷增加它們的值。這是麻煩的跡象嗎?我以某種方式不回到池中,或者這個值是否會增加正常行爲?ManagedThreadId不斷增加

+2

他們是ThreadPool線程嗎?如果沒有,這聽起來很正常。 – spender

+0

奇怪的是,你會認爲他們失敗或保持平等不成問題。 –

回答

3

只要你的線程正在返回(而不是阻塞,等待,睡眠或無限循環),那麼你沒事。 ManagedThreadId僅僅是一個唯一的標識符,它不是一個「線程數」在所有(http://msdn.microsoft.com/en-us/library/system.threading.thread.managedthreadid.aspx

Thread.ManagedThreadId

,表示此唯一標識符的整數託管線程。

爲了確保您的線程正在返回,請在VS調試器中暫停您的進程並告訴它凍結所有線程並查看線程調試窗口。在運行時環境中,我會修改線程代碼以增加一個鎖定的整數,並在線程返回時遞減相同的鎖定整數(使用try/finally塊確保拋出的異常不會導致整數遞減被遺漏) 。

+0

感謝您的建議@David。這一切似乎都運行良好,但我注意到幾天後,id值超過了數百。 –

+0

另外不要忘記,CLR運行自己的線程,比如GC和COM支持所需的其他線程(即使你不使用COM)。 – Dai

1

'正確'的答案是不,這是不正常的。不像CLR被打破。你的應用程序應該(大多數情況下,除非你有一些很好的理由,我甚至無法想象它會是什麼),請仔細使用Thread線程。如果您正在創建其他100個線程,則99%會做錯事。

你要麼殺死你應該重新使用它們的線程,要麼在你使用線程線程的地方使用線程池線程。

編輯好的。你可能不相信我。但是MSDN也這麼說:

即使承載公共語言運行庫的非託管代碼將線程實現爲光纖,ManagedThreadId屬性的值也不會隨時間而變化。

所以只是爲了強調它(我沒有在第一次嘗試中明確)......你沒有看到線程ID在現有線程中發生變化。你看到不同的線程彈出(用你自己的話說在幾百個)......新的線程獲得新的ID。 舊線程不會更改其ID。

+1

它不是線程的數量,而是不斷增加整數值的線程ID。 –

+0

我的前提是,當您通過th = new Thread()創建新線程時ID會增加; (或者你的線程池已經耗盡,它正在創建新的線程)......我的前提是一旦線程被創建,它就不會改變它的ID。我很想看到一個可能證明我錯誤的代碼。 –

+0

我知道,他們是新主題。低數字不會被重用似乎很奇怪。 –