难道不可以将任务添加到Task.WhenAll
已在等待的列表中吗?如何将任务添加到Task.WhenAll正在等待的集合中?
我想等待所有任务完成,并且有可能在初始化后创建新的任务。但是这里Task.WhenAll
不会等待稍后添加到集合中的新任务。
List<Task> tasks = new List<Task>();
var task1 = Task.Run(async() =>
{
Debug.WriteLine("task #1 started");
await Task.Delay(TimeSpan.FromSeconds(20));
Debug.WriteLine("task #1 finished");
});
var task2 = Task.Run(async() =>
{
Debug.WriteLine("task #2 started");
await Task.Delay(TimeSpan.FromSeconds(30));
Debug.WriteLine("task #2 finished");
});
var task3 = Task.Run(async() =>
{
Debug.WriteLine("task #3 started");
await Task.Delay(TimeSpan.FromSeconds(10));
var inner = Task.Run(async() =>
{
Debug.WriteLine("inner task started");
await Task.Delay(TimeSpan.FromSeconds(40));
Debug.WriteLine("inner task finished");
});
tasks.Add(inner);
Debug.WriteLine("task #3 finished");
});
tasks.Add(task1);
tasks.Add(task2);
tasks.Add(task3);
await Task.WhenAll(tasks);
Debug.WriteLine("All finished");
输出:
task #2 started
task #3 started
task #1 started
task #3 finished
inner task started
task #1 finished
task #2 finished
All finished
inner task finished < didn't wait for this to finish
如果你看看[源代码](https://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs,69351c6da968e5d1),你会看到集合/数组之前被复制过内部机制踢了进来,因此对原始集合的任何更改都不会被观察到。 –
我认为你能做的最好的是手动循环--' while(tasks.Count> 0){等待Task.WhenAll(任务); tasks = tasks.Where(t =>!t.IsCompleted); }'作为草图 –
@Damien_The_Unbeliever非常感谢。我认为这是最好的解决方案。你不会把它写成答案吗? – Blendester