【问题标题】:Is it possible to wait for unknown Tasks to complete?是否可以等待未知任务完成?
【发布时间】:2011-08-24 19:12:57
【问题描述】:

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

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

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

【问题讨论】:

  • “所有正在运行的任务”是指您在流程/应用程序中创建的任务吗?
  • @n8wrl:我说“我的应用程序产生的所有任务”......所以是的。

标签: .net multithreading task-parallel-library


【解决方案1】:

我知道这不能直接回答您的问题,但您可以更改您的架构,以便将所有任务创建为一个“主要”任务的子任务。等待这个“主”任务会自动等待它的所有子任务。

你可以像这样创建一个子任务:

Task.Factory.StartNew(
    () => /* ... */,
    TaskCreationOptions.AttachedToParent
);

当涉及到子任务的主题时,您可能会发现以下链接很有用:

【讨论】:

  • 这是个好主意 - 我会考虑的。谢谢。 +1
【解决方案2】:

由于任何 Task 都可以由任何 .NET 代码(即 BCL、某些库等)生成,因此您可能不想等待所有未完成的任务,而只等待您自己的代码具有的任务创建的。最简单的方法是创建自己的工厂,使用底层工厂跟踪所有未完成的任务并公开所需的等待函数

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

【讨论】:

  • 我已经做了一些与此非常相似的事情,但是我允许我的类维护自己的任务列表并实现您编写的相同 WaitAll() 方法,该方法由IUsesTasks 接口。这很符合我目前的框架。但是,我也喜欢你的想法,也许比我的更喜欢。 +1。
  • 我接受了这一点,因为我最终做了类似的事情,我喜欢t.ContinueWith(x =&gt; _tasks.Remove(x));,这是我没想到的。谢谢。
  • 此代码不是线程安全的。例如,如果StartNew 由并行任务调用,则可能会在非线程安全的容器上并行尝试调用RemoveAdd。此外,如果在调用WaitAll 期间任务完成,则Remove 可能会同时调用ToArray。这些问题可以通过锁定或使用线程安全集合代替HashSet 来解决,但也有更微妙的问题:例如,如果您当前正在等待的任务之一调用StartNew,您会有一个“泄露”的任务。
  • @Branko Duh .. 这就是我发布玩具实现的结果。修复了并发问题。你提到的第二个有点复杂。如果我为 waitall 锁定 _tasks,可能会导致死锁。我运行一个循环等待所有并删除已完成的任务,直到任务耗尽。我会把这个实现留给读者:)
猜你喜欢
  • 2012-04-13
  • 2020-12-20
  • 2019-07-22
  • 1970-01-01
  • 2018-02-26
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多