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
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
}
Una opción sería usar un EventWaitHandle para completar la señal.
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.
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.
- 1. Backbone: Espere a que la búsqueda múltiple continúe
- 2. ¿Cómo puede hacer para que su código espere a que se completen las funciones html() y append()?
- 3. Solicitud multiproceso/asincrónica y espere a que se hayan completado y luego procese los resultados
- 4. ¿Cómo hacer que jQuery espere hasta que se termine un efecto?
- 5. ¿Qué motivos pueden hacer que ShellExecute falle?
- 6. ¿Cómo puedo hacer que un script espere una contraseña?
- 7. ¿Cómo hacer que la ejecución se detenga, duerma, espere X segundos en R?
- 8. ¿Cómo puedo hacer que un programa espere un cambio de variable en javascript?
- 9. Espere hasta que los elementos HTML obtengan una clase y luego hagan algo
- 10. ¿Qué métodos, además de escuchar solicitudes de sondeo, se pueden usar para encontrar dispositivos wifi 802.11?
- 11. ¿Por qué necesita métodos parciales en C#? ¿Se pueden usar eventos para lograr el mismo objetivo?
- 12. ¿Cómo hago para que un subproceso espere a que JFrame se cierre en Java?
- 13. Usando Java, ¿puedo hacer que una JVM genere otra, y luego hacer que la original salga?
- 14. ¿La mejor manera de hacer que NSRunLoop espere a que se establezca una bandera?
- 15. ¿Se pueden usar TestContext.Properties?
- 16. Código EF Primero: Métodos que se pueden traducir a SQL
- 17. ¿Cómo hacer un ListView con elementos que se pueden arrastrar?
- 18. espere a que se conecte gdb
- 19. ¿Qué tipos se pueden usar para miembros de anotación Java?
- 20. ¿Cómo hacer que Behat espere una llamada AJAX?
- 21. ¿Qué técnicas se pueden usar para hacer las pruebas de escritura más interesantes?
- 22. Espere a que el código finalice la ejecución
- 23. Usar sleep() e interrupt() para reutilizar thread
- 24. ¿Qué son estos subprocesos que se spwaned cuando una aplicación Java comienza su ejecución?
- 25. Java: espere el proceso de ejecución hasta que salga
- 26. ¿Qué señales se pueden usar con seguridad para matar un proceso de Git y cuáles no?
- 27. Python espera x seg para una clave y continuar la ejecución si no se presiona
- 28. ¿Cómo hacer que la GUI espere al servicio de Windows?
- 29. ¿Qué bibliotecas de Java se pueden usar para generar KML?
- 30. std :: thread - nombrando su hilo
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
@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. –
No olvide, AutoResetEvent, WaitHandles etc. implementa IDisposable –