是否可以等待未知任务完成?

时间:2011-08-24 19:12:57

标签: .net multithreading task-parallel-library

使用.NET任务并行库,是否有一种内置方式可以等待所有正在运行的任务完成,而无需实际引用任务?

Task.WaitAny()Task.WaitAll()都需要一组Task个实例。我喜欢的是类似Task.WaitAll()的东西,它不带任何参数,只等待我的应用程序生成的任何和所有任务完成。

如果没有,我会在我的框架中构建一些内容,但如果我能帮助它,我不想重新发明轮子。

2 个答案:

答案 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);
    }
}