ContinueWhenAll не ждет завершения всех задач

Я нашел фрагмент кода в Интернете и немного изменил его, чтобы посмотреть, как он работает, но теперь у меня проблема с ContinueWhenAll , поскольку он не ждет завершения всех задач:

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);
}

Я использую этот код, чтобы добавить все задачи в список. Функция DoSomething вычисляет некоторые результаты и добавляет их в BlockingCollection . У меня есть еще одна функция отображения, которая записывает все добавленные результаты из BlockingCollection в консоль.

Я использовал этот код, чтобы дождаться завершения всех задач, но похоже, что он не ждет их, так как программа отображает стандартное «Нажмите любую клавишу, чтобы продолжить» сообщение всего несколько миллисекунды после запуска. (Для завершения программы потребуется ~ 20 секунд)

Task.Factory.ContinueWhenAll(tasks.ToArray(), result => results.CompleteAdding());

Однако, если я добавлю Task.WaitAll (take) в конец программы, программа будет работать нормально:

var consume = Task.Factory.StartNew(() => display(results));
//results = BlockingCollection that I mentioned 

Насколько я понимаю, программе не хватит времени для отображения всех результатов из BlockingCollection , но все же у нее более чем достаточно времени для отображения некоторых результатов, ожидая завершения всех задач.

Может ли кто-нибудь объяснить мне, почему Task.Factory.ContinueWhenAll не ждет, пока будут вычислены все результаты, и программа завершится, как будто в программе нет этой строки кода (через несколько миллисекунд)?

7
задан Itai Bar-Haim 23 October 2018 в 07:37
поделиться