2009-08-07 31 views
15

Tengo un hilo ejecutándose que delega algunas tareas. Cuando se completa una sola tarea, se genera un evento que dice que se ha completado. Estas tareas deben ejecutarse en un orden específico y deben esperar a que finalice la tarea anterior. ¿Cómo puedo hacer que el hilo espere hasta que reciba el evento "tarea completada"? (Aparte del gestor de eventos obvio que establece una bandera y luego un ciclo while sondeando la bandera)¿Qué métodos se pueden usar para hacer que thread espere un evento y luego continúe su ejecución?

Respuesta

27

que a menudo utilizan el mango AutoResetEvent espera cuando tengo que esperar a que una tarea asíncrona para terminar:

public void PerformAsyncTasks() 
{ 
    SomeClass someObj = new SomeClass() 
    AutoResetEvent waitHandle = new AutoResetEvent(false); 
    // create and attach event handler for the "Completed" event 
    EventHandler eventHandler = delegate(object sender, EventArgs e) 
    { 
     waitHandle.Set(); // signal that the finished event was raised 
    } 
    someObj.TaskCompleted += eventHandler; 

    // call the async method 
    someObj.PerformFirstTaskAsync();  
    // Wait until the event handler is invoked 
    waitHandle.WaitOne(); 
    // the completed event has been raised, go on with the next one 
    someObj.PerformSecondTaskAsync(); 
    waitHandle.WaitOne(); 
    // ...and so on 
} 
+1

Basado en la primera respuesta, estoy haciendo algo muy similar a esto. ¿Cuál es la diferencia entre AutoResetEvent y EventWaitHandle inicializado con EventResetMode.AutoReset? – MGSoto

+0

@MGSoto: Creo que la diferencia es mínima (si la hay): 'AutoResetEvent' hereda de' EventWaitHandle', y parece usar el constructor de su clase base para pasar 'EventResetMode.AutoReset' al mismo. –

+2

No olvide, AutoResetEvent, WaitHandles etc. implementa IDisposable –

5

Una opción sería usar un EventWaitHandle para completar la señal.

+0

¿Podrías dar más detalles? explique esto mejor y definitivamente votaré! – Firoso

+1

+1. @firoso, hay muchos detalles en el artículo msdn. –

+0

Incluyendo ejemplos en varios idiomas – bdonlan

1

Se puede utilizar un ManualResetEvent para esto.

El hilo que debe procesarse primero simplemente toma el evento resetEvent, y espera hasta el final para establecer el evento.

El subproceso que debe esperar puede contener un identificador y llamar a resetEvent.WaitOne(). Esto bloqueará ese hilo hasta que el primero se complete.

Esto le permite manejar el bloqueo y el orden de los eventos de una manera muy limpia.

0

He tenido buenos resultados utilizando un método de devolución de llamada que el hilo de trabajo llama cuando está hecho. Mejora el sondeo y hace que sea fácil pasar los parámetros a la persona que llama.

Cuestiones relacionadas