cref - remarks c#
Cómo obtener la notificación de que un System.Threading.Tasks.Task ha completado (3)
En C # moderno, uno ya no necesita llamar a ContinueWith()
explícitamente. Una alternativa a la respuesta aceptada original sería simplemente crear un método async
que await
a la Task
en cuestión y haga lo que quiera cuando se complete la Task
.
Por ejemplo, suponga que desea generar un evento llamado TaskCompleted
cuando TaskCompleted
la Task
. Escribirías un método como:
async Task RaiseEventWhenTaskCompleted(Task task)
{
await task;
TaskCompleted?.Invoke(this, EventArgs.Empty);
}
Para "registrar" la espera, simplemente llame al método anterior. Agregue el manejo de excepciones que desee, ya sea en el método anterior o en algún código que finalmente observe la Task
devuelta por el método anterior.
Actualmente estoy reemplazando algunas funciones de tareas horneadas en casa con una nueva implementación que usa la nueva función System.Threading.Tasks que se encuentra en .net 4.
Sin embargo, tengo un pequeño problema y, aunque puedo pensar en algunas soluciones, me gustaría recibir algunos consejos sobre cuál es la mejor manera de hacerlo, y si me falta algún truco.
Lo que necesito es que un proceso arbitrario pueda comenzar una Tarea pero luego continuar y no esperar a que la Tarea termine. No es un problema, pero cuando necesito hacer algo con el resultado de una tarea, no estoy seguro de cuál sea la mejor manera de hacerlo.
Todos los ejemplos que he visto usan Wait () en la tarea hasta que completa o hace referencia al parámetro Resultado en la tarea. Ambos bloquearán el hilo que inició la Tarea, que no quiero.
Algunas soluciones que he pensado:
Cree un nuevo hilo y comience la tarea con eso, luego use Esperar () o .Resultar para bloquear el nuevo hilo y sincronizar el resultado con la persona que llama de alguna manera, posiblemente con un sondeo a las tareas del parámetro IsCompleted.
Tener una tarea de "Notificar completada" que puedo comenzar después de completar la tarea que quiero ejecutar y luego genera un evento estático o algo así.
Pase un delegado a la entrada de la tarea y llame a eso para notificar que la tarea ha finalizado.
Puedo pensar o hacer ventajas y desventajas con todos ellos, pero especialmente no me gusta la idea de tener que crear explícitamente un nuevo hilo para comenzar la tarea cuando uno de los objetivos de usar la clase de Tareas en primer lugar es para abstraer el uso directo de hilo.
¿Alguna idea sobre la mejor manera? ¿Me estoy perdiendo algo simple? ¿Sería mucho pedir un evento ''Completado'' :)? (¡Claro que hay una buena razón por la que no hay una!)
Puede aplicar una continuación de tarea .
Como alternativa, Task
implementa IAsyncResult , de modo que puede usar los enfoques estándar para esa interfaz (bloqueo, sondeo o espera en su WaitHandle
).
Sospecho que está buscando Task.ContinueWith
. Task.ContinueWith
(o Task<T>.ContinueWith
). Estos básicamente dicen: "Cuando hayas terminado esta tarea, ejecuta esta acción". Sin embargo, hay varias opciones que puede especificar para tomar más control sobre él.
MSDN ofrece muchos más detalles al respecto en "Cómo encadenar varias tareas con continuaciones" y "Tareas de continuación" .