2010-08-11 14 views
11

¿Hay alguna manera de activar un hilo que duerme en C#? Entonces, ¿duerme durante mucho tiempo y lo despiertas cuando quieres que se procese el trabajo?¿Hay alguna manera de despertar un hilo que duerme?

+0

¿En qué configuración exactamente? Realmente necesitaríamos más información sobre la plataforma y/o el modelo de subprocesamiento que está utilizando para poder responder a esto de manera significativa. – Gian

+0

Depende de cómo lo duerma. – zneak

+1

Definitivamente tiene que decirnos al menos de qué lenguaje de programación se trata esta pregunta. – scy

Respuesta

14

Un AutoResetEvent objeto (u otro WaitHandle implementación) se puede utilizar para dormir hasta que se recibe una señal de otro hilo:

// launch a calculation thread 
var waitHandle = new AutoResetEvent(false); 
int result; 
var calculationThread = new Thread(
    delegate 
    { 
     // this code will run on the calculation thread 
     result = FactorSomeLargeNumber(); 
     waitHandle.Set(); 
    }); 
calculationThread.Start(); 

// now that the other thread is launched, we can do something else. 
DoOtherStuff(); 

// we've run out of other stuff to do, so sleep until calculation thread finishes 
waitHandle.WaitOne(); 
3

Si el hilo está dentro de una llamada al Sleep, entonces no hay (generalmente) una forma de activarlo. (La única excepción que conozco es Java, que permite que un sueño finalice antes si otro hilo llama al thread.interrupt().)

El patrón del que está hablando parece llamar a un evento: el hilo contiene un bucle, en la parte superior de la cual espera que ocurra un evento. Si el evento está actualmente desarmado, el hilo "duerme" hasta que otro hilo desencadene el evento. En ese punto, el hilo de dormir se despierta y continúa su trabajo, hasta la próxima vez a través del ciclo cuando duerme para esperar otro evento.

+0

@John, agregaste tu comentario mientras editaba para agregar esa información :). –

+0

lo suficientemente justo que voy a eliminar mi comentario :) –

0

¿this thread help? C# tiene good functionality para el manejo de eventos de subprocesos. He hecho la mayor parte de mi trabajo en Python, pero C# parece tener bibliotecas sólidas para el bloqueo de hilos.

1

La mejor solución sería utilizar Task objetos con el valor predeterminado TaskFactory. Esta API (presentada en .NET 4.0) utiliza un conjunto de hilos con colas de robo de trabajo y todas esas cosas elegantes.

Si .NET 4.0 no está disponible, utilice el ThreadPool, que tiene una cola de trabajos incorporada (que hace un cierto equilibrio de grupos pero no en el mismo alcance que el grupo de subprocesos 4.0).

Si realmente debe hacerlo usted mismo, entonces te recomiendo un BlockingCollection<T>, que es una cola de bloqueo del consumidor/productor añadió en .NET 4.0.

Si realmente debe lo hace usted mismo y no se puede utilizar .NET 4.0, a continuación, se puede utilizar una o ManualResetEventAutoResetEvent junto con una cola -protected lock de trabajo.

3
public void WakeUp() 
{ 
    if (Thread.CurrentThread.ThreadState == ThreadState.WaitSleepJoin) 
    Thread.CurrentThread.Interrupt(); 
} 
+1

Esto abotará el hilo y no lo despertará. – Danpe

+1

@Danpe Dudo que aborte el hilo, entonces ¿cuál sería el sentido de llamarlo una interrupción? Lea esto: http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt(v=vs.110).aspx Tendrá que atrapar la excepción. –

+0

Esta no es la forma de lograr lo que el OP está pidiendo. El código del hilo en sí debería tener un punto de "espera" definitivo en el que espera que el sistema operativo señale para que el hilo vuelva a procesarse. Cualquier llamada a 'Sleep' o' SpinWait' o 'Yield' pondrá el hilo en el estado' WaitSleepJoin'. – Slight

Cuestiones relacionadas