c# - 如何等待嵌套任务?

标签 c# multithreading

假设我有以下情况:

public void Foo()
{
    Task.Run(() => DoWork())
      .ContinueWith((prev) => 
      {
          Console.WriteLine("Hello World!");
      }
}

public void DoWork()
{
    Task.Run(() => HeavyOperation());
    Task.Run(() => HeavyOperation2());
    Task.Run(() => HeavyOperation3());
}

我需要等待 DoWork 中的所有任务完成后才能显示 Hello World,实际上我的代码会显示 Hello World 但任务里面的方法还在运行

最佳答案

您可以使用 Task.WhenAll 返回等待所有任务的 Task :

public Task DoWork()
{
    return Task.WhenAll(
        Task.Run(() => HeavyOperation()),
        Task.Run(() => HeavyOperation2()),
        Task.Run(() => HeavyOperation3()));
}

注意:为了遵循约定,您应该调用此 DoWorkAsync:

public Task DoWorkAsync()
{
    return Task.WhenAll(
        Task.Run(() => HeavyOperation()),
        Task.Run(() => HeavyOperation2()),
        Task.Run(() => HeavyOperation3()));
}

此外,这些操作已经在不同的线程上运行,您不需要 Task.Run 来调用 DoWorkAsync:

DoWorkAsync()
    .ContinueWith((prev) => 
    {
        Console.WriteLine("Hello World!");
    };

关于c# - 如何等待嵌套任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50491552/

相关文章:

c# - 编号列表框

c# - 对 TeamCity 上的程序集依赖链问题进行故障排除

vb.net - 由多个后台 worker 处理的单个任务?

Python threading.stack_size() 无效

C# - 从 "cast"List<BaseClass> 到 List<DerivedClass> 的简单方法?

c# - 如何通过 Microsoft Graph API/SDK 向 Microsoft 团队发送自适应卡?

c# - 如何分析一行代码?

c++ - 线程终止

Android:如何从 C++ 中的另一个线程读取 Assets

python - 是否可以同时执行两个函数