首页 > 解决方案 > Task.Factory.StartNew 中的异步方法在继续之前等待所有任务

问题描述

我有以下代码:

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(tasks) 处停止,而是会继续,即使并非所有任务都已完成。我怎样才能解决这个问题?

标签: c#async-awaittaskmultitasking

解决方案


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

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)在所有任务完成之前都不会执行之后的任何操作(假设我们正在捕获当前上下文)。


推荐阅读