Pregunta

De vez en cuando me consiga un Sistema.Las operaciones de roscado.ThreadStateException al intentar reiniciar un hilo.El código en cuestión es el siguiente:

// Make sure the thread is done stopping
while (this.mThread.ThreadState == ThreadState.Running)
{ 
    Thread.Sleep(0);
}
// Respawn a thread if the current one is stopped or doesn't exist
if (this.mThread == null || this.mThread.ThreadState == ThreadState.Stopped)
{ 
    this.mThread = new Thread(new ParameterizedThreadStart(Monitor)); }
// Start the thread
if (check)
{ 
    this.mThread.Start(60000); 
}
else
{   
    this.mThread.Start(0); 
}

Entonces dos preguntas: ¿es esta la forma correcta de hacer las cosas, y es, ¿hay una manera de evitar el error?

¿Fue útil?

Solución

El problema es que tienes el código que comprueba en primer lugar si se debe crear un nuevo hilo objeto, y otra pieza de código que determina si para iniciar el subproceso objeto.Debido a las condiciones de carrera y cosas similares, el código podría terminar tratando de llamar .Empezar en un hilo ya existente objeto.Teniendo en cuenta que usted no publicar los detalles detrás de la verificación variable, es imposible saber lo que podría provocar este comportamiento.

Usted debe reorganizar su código, así que .De inicio se garantiza que sólo se puede llamar en nuevos objetos.En resumen, usted debe poner el método de Inicio en el mismo si-declaración como la que crea un nuevo subproceso objeto.

Personalmente, me gustaría tratar de reorganizar todo el código, así que no tenía la necesidad de crear otro hilo, pero ajustar el código dentro de la rosca objeto dentro de un bucle para que el hilo sigue pasando.

Otros consejos

Es posible que un hilo para estar en más de un estado a la vez, por tanto, la ThreadState propiedad es en realidad un mapa de bits de estados posibles.Por eso, la prueba de la igualdad con un solo estado no le dará el resultado correcto.Usted tendría que hacer algo como:

if((mThread.ThreadState & ThreadState.Running) != 0)

Sin embargo, la comprobación de estado de subproceso es el mal hacer nada.No estoy del todo claro lo que estamos tratando de lograr, pero voy a suponer que usted está esperando un hilo para terminar antes de reiniciar.En el caso de que usted debe de hacer:

mThread.Join();
mThread = new Thread(new ParameterizedThreadStart(Monitor));
if(check)
    mThread.Start(60000);
else
    mThread.Start(0);

Aunque si usted lo describe el problema que estamos tratando de resolver en más detalle, estoy casi seguro de que va a ser una mejor solución.A la espera de alrededor de un hilo a fin de comenzar de nuevo, no parece que eficiente para mí.Tal vez usted sólo necesita algún tipo de comunicación inter-thread?

Juan.

Un ThreadStateException, se produce debido a que estamos tratando de iniciar un hilo que no está en un estado de inicio.La más probable de las situaciones sería que ya está en ejecución, o que se ha salido por completo de él.

Potencialmente hay un par de cosas que podría estar pasando.La primera es, el hilo podría haber hecho la transición de Correr a StopRequested, que no está totalmente parado todavía, por lo que su lógica no crear un hilo nuevo, y usted está tratando de iniciar un hilo que acaba de terminar ejecutando o está a punto de finalizar la ejecución (ninguno de los cuales es un estado válido para reiniciar).

La otra posibilidad es que el hilo fue abortado.Hilos que son abortados ir a la Abortado estado, no el estado Detenido, y, por supuesto, no son también válidos para reiniciar.

Realmente, el único tipo de hilo que todavía está vivo, que puede ser "reiniciar" es uno que está suspendido.Puede que usted quiera usar este condicional en su lugar:

if (this.mThread == null || this.mThread.ThreadState != ThreadState.Suspended)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top