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