Task.Factory.StartNew中的异步方法在继续之前等待所有任务

时间:2018-05-29 18:21:36

标签: c# async-await task multitasking

我有以下代码:

public async Task<bool> ExecuteAsync()
{        
    return await someresult;
}


public async Task DoSomethingAsync()
{

   var tasks = new List<Task>();

   foreach (var item in someList)
   {

         var task = Task.Factory.StartNew(async () =>
                    {
                          await ExecuteAsync();
                    });

         tasks.Add(task);
   }


   await Task.WhenAll(tasks);

   // The program execution should stop here and next code should be run when all tasks are completed


}

基本上我处于一个foreach循环中,每个项目我开始一个新的任务。

启动所有任务后,我希望在完成所有任务后执行await Task.WhenAll(tasks);之后的代码。当然所有都是异步的,因此我想知道这是否可能?因为所有都是异步的,所以执行不会在Task.WhenAll(任务)停止,但即使这样也不会完成所有任务。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

首先,为什么你为循环中的每个任务浪费线程池,你的代码可以写成:

public  Task<bool> ExecuteAsync()
{
    return  ItReturnsATask();
}

public async Task DoSomethingAsync()
{

    var tasks = new List<Task>();

      foreach (var item in someList)
      {
        //ExecuteAsync can be replace by ItReturnsATask if there's no extra processing
            tasks.Add(ExecuteAsync());
      }

     await Task.WhenAll(tasks);
}

你的代码错过了异步点,它从线程池创建了几个线程,并使用它们,这些线程浪费在这里。至于你的实际问题,await Task.WhenAll(tasks)之后的任何事情都没有在所有任务完成之前执行(假设我们正在捕获当前上下文)。