Quiero activar una tarea para que se ejecute en una cadena de fondo. No quiero esperar para completar las tareas.¿Se considera aceptable no invocar a Dispose() en un objeto TPL Task?
En .NET 3.5 que habría hecho esto:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
En .NET 4 TPL es la forma sugerida. El patrón común que he visto recomendada es:
Task.Factory.StartNew(() => { DoSomething(); });
Sin embargo, el método StartNew()
devuelve un objeto que implementa Task
IDisposable
. Este parece ser pasado por alto por las personas que recomiendan este patrón. La documentación de MSDN en el método Task.Dispose()
dice:
"Llame siempre a Dispose antes de lanzar su última referencia a la tarea."
No se puede invocar a deshacerse de una tarea hasta que se complete, por lo que tener el hilo principal en espera y deshacerse de la llamada se anularía al punto de hacer en una cadena de fondo en primer lugar. Tampoco parece haber ningún evento completado/terminado que pueda usarse para la limpieza.
La página MSDN en la clase Tarea no hace ningún comentario al respecto, y el libro "Pro C# 2010 ..." recomienda el mismo patrón y no hace comentarios sobre la eliminación de tareas.
Sé que si lo dejo, el finalizador lo atrapará al final, pero ¿esto va a volver y morderme cuando estoy haciendo mucho fuego? & ¿Olvidaste de este tipo de tareas y el hilo del finalizador se abruma?
Así que mis preguntas son:
- ¿Es aceptable no llamar
Dispose()
en la claseTask
en este caso? Y si es así, ¿por qué y hay riesgos/consecuencias? - ¿Hay alguna documentación que discuta esto?
- ¿O hay una forma adecuada de deshacerse del objeto
Task
que me he perdido? - ¿O hay otra forma de hacer fuego & olvida las tareas con el TPL?
relacionadas: [La forma correcta de fuego y olvidar] (http://stackoverflow.com/q/2630488/119738) (ver [respuesta] (http://stackoverflow.com/questions/ 2630488/the-correct-way-to-fire-and-forget-an-asynchronous-delegate/2630510 # 2630510)) –