2012-03-06 135 views
6

Estoy usando C# .Net4.0 en VS 2010. ¿Cómo reinicio un Thread?Cómo reiniciar un hilo en C# .Net 4.0?

Es como quiero Abort() el hilo y Start() desde el principio otra vez? ¿Es posible?

+1

En general, 'Abortar()' ing de un hilo es una mala idea. ¿Qué problema quieres resolver? – Heinzi

+0

Esto podría ayudarle a: - [Reinicio de un hilo en C# 4.0] [1] [1]: http://stackoverflow.com/questions/1054889/restarting-a-thread-in-net- using-c – Misam

+0

El requisito de detener e iniciar el thread es un poco inusual: ¿cuál es el problema que está tratando de resolver? – dice

Respuesta

7

crear una nueva instancia de subproceso y ejecutar de nuevo. thread1 = new Thread(); thread1.start();

7

Abortar un hilo es a menudo una mala idea. Él es un consejero. Si se trata de un bucle infinito, se usa un booleano para detener el hilo sin el aborto.

bool run = true; 
Thread thread = new Thread(method); 
thread.start(); 

private void method() 
{ 
    while(run) 
    { 

    } 
} 

Para detener el hilo, acaba de establecer el booleano en false y, normalmente, se puede reiniciar más tarde.

+1

Buen consejo. 'run' debe ser' volátil' para evitar esperas indefinidas debido a las optimizaciones del compilador. – Tudor

+1

Considere usar 'lock', especialmente al establecer el valor booleano. Mejor aún, usándolo en conjunción con 'monitor'. Eche un vistazo aquí: http://stackoverflow.com/questions/1559293/c-sharp-monitor-wait-pulse-pulseall#1559662 –

+0

Mi función de hilo se inicia cuando hago clic para crear el servidor. Realiza una inicialización y luego entra en un bucle infinito que contiene socket.Accept().El control se atasca en esta declaración, por lo que no puedo usar este método de bloqueo. – Shashwat

2

Thread.Abort no garantiza que el hilo termine. Por ejemplo, si tiene una consulta de larga ejecución, Abort no terminará la ejecución de la consulta o la cancelación del hilo. De hecho, el hilo seguirá vivo hasta que se complete la consulta.

Si está haciendo todo en código administrado y no está bloqueado por recursos no administrados, y debe abortar un hilo, thread.Abort() está perfectamente bien.

Sin embargo, no puede llamar a Start en una secuencia que ha finalizado. Tendrá que crear otro subproceso y llamar a Inicio en ese subproceso. La creación de subprocesos es algo costosa, en cuanto a memoria, en .NET (en comparación con otros lenguajes), por lo que hay algunos inconvenientes.

+0

En realidad, crear el hilo una y otra vez no será demasiado caro, ya que no se realizará con mucha frecuencia. – Shashwat

1

Cuando desee reiniciar el hilo desde el principio, en realidad desea reiniciar una ejecución de determinada función (flujo de código) en el hilo. Cuando crea un hilo y pasa una función para su ejecución, la vida de un hilo terminará tan pronto como la función termine su propia ejecución. Solo necesita cambiar el diseño del código que le permitirá reiniciar la función al recrear un nuevo hilo. Pero para funciones cortas le aconsejo usar ThreadPool.

1

Dado que está utilizando .NET 4.0, donde MS había introducido el "Marco de cancelación cooperativa". Puedes leer más de este blog. Negociar directamente con Thread es (cada vez más) desaconsejado.