我的程序正在创建一些任务来完成一些工作。 现在我想在退出程序之前等待所有任务完成。
我知道Task.WaitAll(...)
方法,但在我的情况下,我想动态创建一些任务 - >在调用Task.WaitAll()
时它们不存在。
我现在的问题是: 如何完成所有正在运行的任务?
这就是我现在正在做的事情。
它有效,但我想确保这也是一个很好的方法。
public class Test
{
public ConcurrentBag<Task> RunningTasks { get; set; }
public Test()
{
RunningTasks = new ConcurrentBag<Task>();
}
public void RunIt(){
//...create some Tasks asynchronously so they may be created in a few seconds and add them to the list like
//RunningTasks.Add(...);
//Just wait until all tasks finished.
var waitTask = Task.Run(() =>
{
while (true)
{
if (RunningTasks.All(t => t.IsCompleted))
break;
Thread.Sleep(1000);
}
});
waitTask.Wait();
}
}
答案 0 :(得分:4)
Task.WhenAll()
将采用Task
数组,而ConcurrentBag<T>
支持ToArray()
扩展方法,因此您只需执行以下操作:
await Task.WhenAll(RunningTasks.ToArray())
或者如果您不想使用await
关键字:
Task.WhenAll(RunningTasks.ToArray()).Wait()
<强>更新强>
因此,如果您的RunningTasks
在初次通话后发生变化,您可以很轻松地完成此操作:
while(RunningTasks.Any(t=>!t.IsCompleted))
{
Task.WhenAll(RunningTasks.ToArray());
}
与你的方法相比,主要的好处是,它会在等待时产生其他工作的线程,你的代码会将线程置于休眠状态,直到完成所有任务。