2010-05-06 13 views
37

Si tengo el siguiente bloque de código en un método (utilizando .NET 4 y la Biblioteca de tareas en paralelo):Can .NET Las instancias de tareas quedan fuera del alcance durante la ejecución?

var task = new Task(() => DoSomethingLongRunning()); 
task.Start(); 

y el procedimiento vuelve, será esa tarea ir fuera de alcance y ser basura recogida, o ¿se ejecutará hasta su finalización? No he notado ningún problema con GCing, pero quiero asegurarme de que no me estoy preparando para una condición de carrera con el GC.

+0

Después de un tiempo encontré algo pequeño sobre esto y pensé en compartirlo, para mayor completitud ... Ver la actualización a continuación. –

Respuesta

30

Actualización:

Después de que respondieron a esta pregunta (! Hace mucho tiempo) me di cuenta de que no es cierto que las tareas siempre hasta la terminación - hay una pequeña, digamos caso "esquina", donde las tareas pueden no terminar.

El motivo es que: como he respondido anteriormente, las tareas son esencialmente hilos; pero son de fondo hilos. Los subprocesos de fondo se cancelan automáticamente cuando finalizan todos los subprocesos en primer plano. Entonces, si no hace nada con la tarea y el programa finaliza, existe la posibilidad de que la tarea no se complete.

Siempre debe esperar en las tareas. Se puede encontrar más información en el excellent answer Jon gave me.


original:

tareas están programadas para el ThreadPool, lo que significa que son esencialmente threads¹ (en realidad, se encapsulan hilos).

Desde el Thread documentation:

No es necesario mantener una referencia a un objeto hilo una vez que se haya iniciado el hilo. El subproceso continúa ejecutándose hasta que se completa el procedimiento de subproceso.

Así que, no, no es necesario que conserve una referencia.

Además, el documentation afirma que la mejor forma de crear una tarea es utilizarlo de fábrica:

También puede utilizar el método StartNew para crear e iniciar una tarea en una operación. Esta es la manera preferida para crear e iniciar tareas si la creación y la programación no tienen que ser separados (...)

espero que ayude.


¹ De acuerdo a la documentation:

Una tarea representa una operación asíncrona , y en cierto modo se se asemeja a la creación de un nuevo elemento de trabajo hilo o ThreadPool, pero a un mayor nivel de abstracción.

11

La tarea se ejecutará hasta su finalización. Incluso si no hay otras referencias (sin rootear, creo que es el término), el grupo de subprocesos todavía tendrá una referencia a él, y evitará que sea un Recolector de Basura al menos (digo al menos, porque incluso después de que se complete, no hay garantía de que será basura recolectada) hasta que se complete.

+0

Sí, 'rooteado' es el término correcto. Siempre que * algo * tenga una referencia válida (en vivo) a la instancia de la tarea, no será elegible para la recopilación. En este caso, el grupo de subprocesos en sí mantendrá esa referencia hasta que se complete el subproceso. –

+5

Para ser más precisos, el programador de tareas del TPL tendrá una referencia a la tarea mientras se está ejecutando. Sin esa referencia, la tarea puede ser basura recolectada, pero eso no detendrá el código que se ejecuta desde el final. – Steven

Cuestiones relacionadas