42 votes

Les instances de tâches .NET peuvent-elles être hors de portée pendant l'exécution?

Si j'ai le bloc de code suivant dans une méthode (en utilisant .NET 4 et la bibliothèque parallèle de tâches):

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

et la méthode retourne, cette tâche sortira-t-elle du champ d'application et sera-t-elle récupérée ou va-t-elle se terminer? Je n'ai remarqué aucun problème avec GCing, mais je veux m'assurer que je ne me prépare pas pour une condition de course avec le GC.

32voto

Bruno Brant Points 3590

Mise à jour:

Après que j'ai répondu à cette question (il y a longtemps!) J'ai trouvé qu'il n'est pas vrai que les Tâches s'exécutent toujours à la fin - il y a une petite, disons-le, "coin" de cas, où des tâches ne peut pas se terminer.

La raison en est que ce: Comme j'ai répondu précédemment, les Tâches sont essentiellement fils; mais elles sont fond de threads. Threads d'arrière-plan sont automatiquement annulée lorsque tous les originaux fils de finition. Donc, si vous ne faites rien à la tâche et à la fin du programme, il y a une chance que la tâche ne sera pas terminée.

Vous devez toujours attendre sur les tâches. Plus d'informations peuvent être trouvées sur l' excellente réponse de Jon m'a donné.


Origine:

Des tâches sont planifiées pour le pool de threads, ce qui signifie qu'ils sont essentiellement threads1 (en fait, ils encapsulent les threads).

À partir du Fil de la documentation:

Il n'est pas nécessaire de conserver un référence à un objet Thread une fois que vous ont commencé le fil. Le fil continue de s'exécuter jusqu'à ce que le thread la procédure est terminée.

Alors, non, il n'est pas nécessaire de conserver une référence à elle.

Aussi, la documentation stipule que la meilleure façon de créer une Tâche est d'utiliser l'usine de:

Vous pouvez également utiliser la méthode StartNew pour créer et démarrer une tâche dans une le fonctionnement. C'est la meilleure façon pour créer et démarrer des tâches si la création et de la programmation n'ont pas à être séparés (...)

Espérons que cela aide.


1 en Conséquence de la documentation:

Une tâche asynchrone l'opération, et à certains égards, c' ressemble à la création d'un nouveau thread ou ThreadPool élément de travail, mais à un niveau d'abstraction supérieur.

13voto

Kevin Points 57797

La tâche se terminera. Même s'il n'y a pas d'autres références à lui (n'étant pas enraciné, je crois que c'est le terme), le pool de threads contiendra toujours une référence à lui, et l'empêchera d'être au moins Garbage Collected (je dis au moins, parce que même une fois terminé, rien ne garantit qu'il sera récupéré) jusqu'à la fin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X