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 Taskobjeto 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 laTaskclase 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
Taskobjeto que me he perdido? - ¿O hay otra forma de disparar y olvidar tareas con el TPL?