Асинхронный метод в Task.Factory.StartNew ожидает все задачи, прежде чем продолжить - PullRequest
0 голосов
/ 29 мая 2018

У меня есть следующий код:

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 голосов
/ 29 мая 2018

Прежде всего, почему вы тратите пулы потоков для каждой задачи в цикле, ваш код может быть записан как:

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) не будет выполнено до того, как все задачи будут завершены (при условии, что мы фиксируем текущий контекст).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...