Quiero activar una tarea para que se ejecute en un hilo de fondo. No quiero esperar a que se completen las tareas.
En .net 3.5 hubiera hecho esto:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
En .net 4, el TPL es la forma sugerida. El patrón común que he visto recomendado es:
Task.Factory.StartNew(() => { DoSomething(); });
Sin embargo, el StartNew()
método devuelve un Task
objeto que implementa IDisposable
. Esto parece ser pasado por alto por las personas que recomiendan este patrón. La documentación de MSDN sobre el Task.Dispose()
método dice:
"Siempre llame a Eliminar antes de liberar su última referencia a la Tarea".
No puede invocar la disposición en una tarea hasta que se complete, por lo que, en primer lugar, hacer que el subproceso principal espere y elimine la llamada anularía el punto de hacerlo en un subproceso en segundo plano. Tampoco parece haber ningún evento completado / terminado que pueda usarse para la limpieza.
La página de MSDN en la clase Tarea no comenta sobre esto, y el libro "Pro C # 2010 ..." recomienda el mismo patrón y no hace ningún comentario sobre la eliminación de tareas.
Sé que si lo dejo, el finalizador lo atrapará al final, pero ¿volverá esto y me morderá cuando estoy haciendo mucho fuego y olvido tareas como esta y el hilo del finalizador se abruma?
Entonces mis preguntas son:
- ¿Es aceptable no llamar
Dispose()
a laTask
clase en este caso? Y si es así, ¿por qué hay riesgos / consecuencias? - ¿Hay alguna documentación que discuta esto?
- ¿O hay una forma adecuada de deshacerse del
Task
objeto que me he perdido? - ¿O hay otra forma de disparar y olvidar tareas con el TPL?