2011-12-21 55 views
5

我的程序爲某些任務創建了一些線程。ManagedThreadID不是唯一的嗎?

我的代碼是這樣的:

Dictionary<int, double> threadStates = new Dictionary<int, double>(); 
for (int i = 0; i < SubNNs.Count(); i++) 
{ 
    Thread tt = new Thread(StartTrainingSubs); 
    threadStates.Add(tt.ManagedThreadId, 0); 
    tt.Priority = ThreadPriority.Highest; 
    tt.Start(i); 
} 

但有時候,如果SubNNs.Count()變大(10-20),該計劃拋出此異常:「用相同的密鑰已經被添加的項目。」在線threadStates.Add(tt.ManagedThreadId, 0);

爲什麼我給這個錯誤?是不是ManagedThreadId獨一無二? 如果是,我該怎麼辦?

如果不是,也許一個線程完成,另一個線程開始相同ManagedThreadId?可能嗎?如何防止這個問題?

還是有另一個問題?

編輯:用戶說,ManagedThreadId可以重複使用。因此,由於在後面的代碼部分中,每個線程都需要使用唯一的編號來了解自己,有沒有什麼方法可以像線程一樣添加名稱,以便每個線程都可以獲得唯一的編號?

感謝您的任何建議!

+3

是的,線程ID被回收。 –

回答

6

如果否,可能是一個線程完成,並且另一個線程以相同的ManagedThreadId開頭?可能嗎?如何防止這個問題?

是的。受管理的線程ID可以重複使用。它們不是字典狀態鍵的好選擇。

而不是使用線程ID來跟蹤狀態,你應該考慮使用一些其他的唯一值。在你的情況下,「我」每個循環都是唯一的 - 爲什麼不把它當作你的鑰匙?

+0

謝謝。 「我」是獨一無二的,沒錯。但在另一部分代碼中,每個線程都需要知道自己,每個線程都知道它的ManagedThreadId,但不是關於「我」。 –

+0

我可以爲每個線程設置一個名稱嗎?那麼,每個線程都可以識別自己? –

+1

@Mahdi你需要什麼線程ID?你可以將信息傳遞給線程的開始 - 你現在正在做這件事('tt.Start(i);')只需傳遞你所需要的狀態。如果您需要一個唯一的標識符,請將參數化的線程啓動例程先傳入。 –