Я нашел кусок кода в сети и немного его изменил, чтобы посмотреть, как он работает, но теперь у меня проблема с 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
в консоль.
Я использовал этот код для ожидания завершения всех задач, но, похоже, он не ждет их, посколькуПрограмма выводит стандартное сообщение "Press any key to continue"
через несколько миллисекунд после его запуска.(Для завершения программы потребуется ~ 20 секунд)
Task.Factory.ContinueWhenAll(tasks.ToArray(), result => results.CompleteAdding());
Однако, если я добавлю Task.WaitAll(consume)
в конец программы, программа будет работать нормально:
var consume = Task.Factory.StartNew(() => display(results));
//results = BlockingCollection that I mentioned
НасколькоЯ понимаю, что у программы не будет достаточно времени для отображения всех результатов из BlockingCollection
, но все же у нее будет более чем достаточно времени для отображения некоторых из них в ожидании завершения всех задач.
Может кто-нибудь объяснить мне, почему Задача.Factory.ContinueWhenAll не ждет, пока все результаты будут вычислены, и программа заканчивается, как будто в программе нет этой строки кода (через несколько миллисекунд)?