Вы модифицируете List<>
без блокировки ... Вам нравится жить опасной жизнью :-) Сохраните Count
из _tasks
перед выполнением WaitAll
, затем после проверки WaitAll
Count
из _tasks
.Если это не так, сделайте еще один раунд (поэтому вам нужно while
вокруг WaitAll
.
int count = _tasks.Count;
while (true)
{
await Task.WhenAll(_tasks);
lock (_tasks)
{
if (count == _tasks.Count)
{
Console.WriteLine("All Tasks complete");
break;
}
count = _tasks.Count;
Console.WriteLine("Some Tasks complete");
}
}
async Task Func1(int n)
{
Console.WriteLine($"Func1-{n} started");
await Task.Delay(2000);
if ((n % 3) == 1)
{
lock (_tasks)
{
_tasks.Add(Func2(n));
}
}
Console.WriteLine($"Func1-{n} complete");
}
Я добавлю второй (возможно, более правильное решение), который отличается от того, что вывы делаете: вы можете просто await
новые Task
s из Task
s, которые их сгенерировали, без каскадирования их в коллекцию * 1016. * Если A создает B, то A не заканчивается до тех пор, пока не завершится B.Очевидно, вам не нужно добавлять новые Task
s в коллекцию _tasks
.