【问题标题】:How to run multiple threads and await for complete all of them如何运行多个线程并等待完成所有线程
【发布时间】:2012-04-09 20:26:23
【问题描述】:

我想编写一个运行多个线程的方法,并且我希望在我的方法结束之前使用 async/await 确保所有线程都已完成。我该怎么做?

请考虑这个伪代码:

private async void SomeWork()
{
    var a = doWork1();
    var b = doWork2();
    var c = doWork3();
    var d = doWork4();
    ...
    //I want to assure that all of above thread are complete using `C#-5` new features   
}

我该怎么做?

【问题讨论】:

    标签: c# multithreading async-ctp c#-5.0


    【解决方案1】:

    您的要求与您的代码示例不匹配:您将方法标记为async,这意味着您希望此方法能够在完成其工作之前返回。然而,您说您希望它仅在所有工作完成后返回。

    因此,如果您希望您的方法是同步的,请不要使用async 并手动等待所有任务完成:

    private void SomeWork()
    {
        var a = doWork1();
        var b = doWork2();
        var c = doWork3();
        var d = doWork4();
        ...
        a.Wait();
        b.Wait();
        c.Wait();
        d.Wait();
    }
    

    或者,更优雅:

        Task.WaitAll(a, b, c, d);
    

    【讨论】:

    • Task.WaitAll() 是一个params 方法,因此您可以简单地将其称为Task.WaitAll(a, b, c, d)
    【解决方案2】:

    async 的做法是让你的方法返回一个Task,然后该方法的调用者将await(或Wait())它。您的方法可能如下所示:

    private async Task SomeWork()
    {
        var a = doWork1();
        var b = doWork2();
        var c = doWork3();
        var d = doWork4();
        ...
        await Task.WhenAll(a, b, c, d);
    }
    

    【讨论】:

      【解决方案3】:
          private void ExecuteManyTasks(int how_many)
          {
              var tasks = new List<Task>();
      
              for (var i = 0; i < how_many; i++)
              {
                  tasks.Add(Task.Run(() =>
                  {
                      // Do your stuff here
                      Thread.Sleep(1000);
                  }));
              }
      
              // Wait for all to finish
              Task t = Task.WhenAll(tasks);
              try
              {
                  t.Wait();
              }
              catch { }
          }
      

      【讨论】:

        猜你喜欢
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        • 2012-07-22
        • 1970-01-01
        相关资源
        最近更新 更多