使用.NET任务并行库,是否有一种内置方式可以等待所有正在运行的任务完成,而无需实际引用任务?
Task.WaitAny()
和Task.WaitAll()
都需要一组Task
个实例。我喜欢的是类似Task.WaitAll()
的东西,它不带任何参数,只等待我的应用程序生成的任何和所有任务完成。
如果没有,我会在我的框架中构建一些内容,但如果我能帮助它,我不想重新发明轮子。
答案 0 :(得分:5)
我知道这不会直接回答您的问题,但您可以更改您的体系结构,以便将所有任务创建为一个“主要”任务的子项。等待这个“主要”任务将自动等待其所有孩子。
您可以像这样创建子任务:
Task.Factory.StartNew(
() => /* ... */,
TaskCreationOptions.AttachedToParent
);
在涉及子任务的主题时,您可能会发现以下链接很有用:
答案 1 :(得分:4)
由于任何.NET代码(即BCL,某些库等)都可以生成任何Task
,您可能不希望等待所有未完成的任务,而只是等待您自己的任务代码已创建。最简单的方法是创建自己的工厂,使用跟踪所有未完成任务的底层工具并公开所需的等待函数
public class MyTaskFactory {
private HashSet<Task> _tasks = new HashSet<Task>();
public Task<T> StartNew<T>(Func<T> func) {
var t = Task.Factory.StartNew(func);
t.ContinueWith(x => {
lock(_tasks) {
_tasks.Remove(x);
}
});
lock(_tasks) {
_tasks.Add(t);
}
return t;
}
// ... implement other StartNew overrides ...
public void WaitAll() {
Task[] tasks;
lock(_tasks) {
tasks = _tasks.ToArray();
}
Task.WaitAll(tasks);
}
}