ContinueWhenAll ne pas attendre pour toutes les tâches à remplir
J'ai trouvé un morceau de code sur le web et ont modifié un peu pour voir comment il fonctionne, mais maintenant j'ai un problème avec ContinueWhenAll
comme il n'attendez pas pour toutes les tâches d'être fini:
List<Task> tasks = new List<Task>();
for (int i = 0; i < 20; i++)
{
int j = i;
var compute = Task.Factory.StartNew(() => results.Add(DoSomething(j)));
tasks.Add(compute);
}
Je suis en utilisant ce code pour ajouter toutes les tâches de la liste. DoSomething
fonction calcule les résultats obtenus et les ajoute à BlockingCollection
. J'ai une autre fonction d'affichage qui écrit tous les résultats ajoutés à partir de BlockingCollection
à la console.
J'ai utilisé ce code d'attendre que toutes les tâches à réaliser, mais on dirait qu'il n'a pas les attendre pour que le programme affiche la norme "Press any key to continue"
message seulement quelques millisecondes après qu'il a été lancé. (Il faut prendre la ~20 sec pour le programme complet)
Task.Factory.ContinueWhenAll(tasks.ToArray(), result => results.CompleteAdding());
Cependant si j'ajoute Task.WaitAll(consume)
à la fin du programme, le programme fonctionne très bien:
var consume = Task.Factory.StartNew(() => display(results));
//results = BlockingCollection that I mentioned
Comme je le comprends, le programme n'aura pas assez de temps pour afficher tous les résultats de BlockingCollection
, mais encore il a plus qu'assez de temps pour afficher un peu de temps d'attente pour toutes les tâches à effectuer.
Quelqu'un pourrait-il m'expliquer pourquoi la Tâche.Usine.ContinueWhenAll ne pas attendre tous les résultats calculés et programme vient à une fin comme il n'y a pas de ligne de code dans le programme (après quelques millisecondes)?
OriginalL'auteur Dan | 2011-07-23
Vous devez vous connecter pour publier un commentaire.
Task.Factory.ContinueWhenAll
n'est pas un blocage de la méthode; elle va commencer une nouvelle tâche qui ne fonctionne que lorsque tous les tâches sont terminées il y a l'exécution, il est Donc normal de voir un message de quelques millisecondes après le programme a été lancé, car il ne sera pas bloc à votre attente principale pour les tâches de finition.De msdn:
Où la
Task.WaitAll
sera bloc à l'appelant en attente pour l'ensemble des Tâches d'exécution.Lorsque
ContinueWhenAll
Le programme ne sera paswaits on that line
il va à la ligne suivante, et en même temps de créer une nouvelle tâche qui ne peut pas fonctionner jusqu'à ce que la condition des tâches de finitions. mais leWaitAll
en attente sur la ligne "bloc" jusqu'à ce que tous fourni des tâches sont terminées il y a exécution.Semble que ce n'est pas vrai, jetez un oeil à son lien blogs.msdn.com/b/csharpfaq/archive/2010/06/18/... vous trouverez une partie en disant: j'ai déjà utilisé le ContinueWhenAll méthode qui attend un tableau des tâches pour terminer.
Il devrait y avoir une autre explication à ce problème
Il planifie une nouvelle tâche qui sera exécuté après la première série de tâches de finition. Elle ne cause pas d'attente dans le thread qui appelle
ContinueWhenAll
. Lors de ce blog dit qu'il attend un tableau des tâches pour terminer, il signifie seulement la nouvelle tâche attend pour les autres tâches de finition. Parfois, vous devriez essayer de lire la documentation officielle, qui dit "Crée une continuation de la Tâche qui sera lancé lors de l'achèvement d'un ensemble de Tâches.", au lieu de s'appuyer sur les blogs.OriginalL'auteur Jalal Said