¿Se considera aceptable no llamar a Dispose () en un objeto de tarea TPL?
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, elStartNew()
El método devuelve unTask
objeto que implementaIDisposable
. Esto parece ser pasado por alto por las personas que recomiendan este patrón. La documentación de MSDN en elTask.Dispose()
el 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 la eliminación de 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()
sobre elTask
clase en este caso? Y si es así, ¿por qué hay riesgos / consecuencias?¿Hay alguna documentación que discuta esto?¿O hay una manera apropiada de deshacerse de laTask
objeto que me he perdido?¿O hay otra forma de disparar y olvidar tareas con el TPL?