Actualmente estoy reemplazando algunas funciones tarea recién hecho con una nueva aplicación mediante la funcionalidad de nuevos System.Threading.Tasks encontrado en .NET 4.Como llegar una notificación de que ha completado System.Threading.Tasks.Task
Sin embargo, tengo un problema leve, y aunque puedo pensar en algunas soluciones, me gustaría obtener algunos consejos sobre cuál es la mejor manera de hacerlo, y si me falta un truco en alguna parte.
Lo que necesito es que un proceso arbitrario sea capaz de iniciar 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 la mejor manera de hacerlo.
Todos los ejemplos que he visto utilizan Wait() en la tarea hasta que se completa o hace referencia al parámetro Result en la tarea. Ambos bloquearán el hilo que inició la Tarea, que no quiero.
Algunas soluciones que he pensado:
Crear un nuevo hilo y empezar la tarea en la que, a continuación, utilizar wait() o .Result para bloquear el nuevo hilo y sincronizar el resultado de nuevo a la persona que llama de alguna manera, posiblemente con una encuesta al parámetro IsCompleted de las tareas.
Tengo una tarea 'Notificar finalizado' que puedo iniciar después de la finalización de la tarea que quiero ejecutar, que luego genera un evento estático o algo así.
Pase un delegado a la entrada de la tarea y llámelo para notificar que la tarea ha finalizado.
puedo pensar o pros y los contras de todos ellos, pero sobre todo no me gusta la idea de tener que crear explícitamente un nuevo hilo para iniciar la tarea cuando el uno de los objetivos de la utilización de la La clase de tarea en primer lugar es abstraerse del uso directo de subprocesos.
¿Alguna idea sobre la mejor manera? ¿Me estoy perdiendo algo simple? ¿Sería demasiado pedir un evento 'Completado' :)? (Seguro que hay una buena razón por la cual no hay una sola!)
Por curiosidad, ¿por qué no utilizar BackgroundWorker? Tiene la finalización de la tarea, así como la notificación de cancelación. – Robaticus
'BackgroundWorker' ya no es necesario ahora que' Task' está con nosotros. BGW requería un 'SynchronizationContext', que es opcional con' Task' (permitiendo un mayor paralelismo). –