2011-12-21 15 views
5

Il mio programma crea alcuni thread per alcune attività.ManagedThreadID non è univoco?

Il mio codice è simile a questo:

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); 
} 

Ma a volte, se SubNNs.Count() diventa grande (10-20), il programma genera questa eccezione: "Un elemento con la stessa chiave è già stato aggiunto" alla riga threadStates.Add(tt.ManagedThreadId, 0);

Perché ho dato questo errore? ManagedThreadId non è univoco? Se sì, cosa dovrei fare?

e Se no, forse un thread finisce e un altro thread inizia con lo stesso ManagedThreadId? È possibile? come prevenire questo problema?

Oppure c'è un altro problema?

MODIFICA: gli utenti hanno affermato che è possibile riutilizzare ManagedThreadId. Quindi, poiché nelle parti successive del codice, ogni thread deve conoscere se stesso con un numero univoco, c'è un modo per aggiungere qualcosa come un nome al thread che ogni thread può ottenere il suo numero univoco?

Grazie per qualsiasi consiglio!

+3

Sì, gli ID thread vengono riciclati. –

risposta

6

Se no, forse un thread finisce e un altro thread inizia con lo stesso ManagedThreadId? È possibile? come prevenire questo problema?

Sì. Gli ID thread gestiti possono essere riutilizzati. Non sono una buona scelta per una chiave di stato del dizionario.

Invece di utilizzare l'ID di thread per tenere traccia dello stato, è necessario prendere in considerazione l'utilizzo di un altro valore univoco. Nel tuo caso, "i" è un ciclo per loop unico - perché non usarlo come chiave?

+0

Grazie. "io" è unico, giusto. ma in un'altra parte del codice, ogni thread deve conoscere se stesso, ogni thread conosce il suo ManagedThreadId, ma non riguarda "i". –

+0

Posso impostare qualcosa come un nome per ogni thread? Quindi, ogni thread può identificarsi? –

+1

@Mahdi Che cosa ti serve per l'ID del thread? Puoi passare le informazioni all'avvio di un thread: lo stai facendo ora ('tt.Start (i);') Passa semplicemente lo stato richiesto. Se hai bisogno di un identificatore univoco, passa in primo piano nella routine ParameterizedThreadStart. –