2011-12-21 22 views
5

Mi programa crea algunos subprocesos para algunas tareas.¿ManagedThreadID no es único?

Mi código es así:

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

Pero a veces, si SubNNs.Count() se hace grande (10-20), el programa emite esta excepción: "Un elemento con que ya se ha añadido la misma clave." en la línea threadStates.Add(tt.ManagedThreadId, 0);

¿Por qué aparece este error? ¿No es ManagedThreadId único? En caso afirmativo, ¿qué debo hacer?

y Si no, tal vez un hilo termina y otro hilo comienza con el mismo ManagedThreadId? ¿Es posible? cómo prevenir este problema?

¿O hay otro problema?

EDITAR: Los usuarios dijeron que ManagedThreadId puede reutilizarse. Entonces, dado que en las partes posteriores del código, cada hilo necesita conocerse a sí mismo con un número único, ¿hay alguna forma de agregar algo como un nombre para enhebrar que cada hilo pueda obtener su número único?

¡Gracias por cualquier consejo!

+3

Sí, los ID de hilo se reciclan. –

Respuesta

6

Si no, tal vez un hilo termina y otro hilo comienza con el mismo ManagedThreadId? ¿Es posible? cómo prevenir este problema?

Sí. Los identificadores de subprocesos administrados se pueden reutilizar. No son una buena opción para una clave de estado de diccionario.

En lugar de usar la ID de hilo para seguir el estado, debería considerar usar algún otro valor único. En su caso, "i" es único por ciclo, ¿por qué no usarlo como clave?

+0

Gracias. "yo" es único, eso es correcto. pero en otra parte del código, cada hilo necesita conocerse a sí mismo, cada hilo conoce su ManagedThreadId, pero no sobre "i". –

+0

¿Puedo establecer algo como un nombre para cada hilo? Entonces, ¿cada hilo puede identificarse? –

+1

@Mahdi ¿Para qué necesitas la ID del hilo? Puede pasar la información al inicio de un hilo; lo está haciendo ahora ('tt.Start (i);') Simplemente pase el estado que necesita. Si necesita un identificador único, pase uno en la rutina ParameterizedThreadStart justo al frente. –

Cuestiones relacionadas