Как заставить использовать Task.WaitAll с асинхронным методом, используя c # - PullRequest
0 голосов
/ 23 января 2019

Я использовал Task.WaitAll внутри HomeController Async method.

Но Task.WaitAll не ждет завершения выполнения async methods.

Может кто-нибудь помочь мне узнать, что я сделал неправильноздесь вместо ожидания сразу переходят к следующему утверждению.

HomeController.cs

private List<Task> taskList = new List<Task>();   
public ActionResult Index()
 {

 for (i=0 ;i<5;i++)
            {
            SendMessages();
            }

             Task.WaitAll(taskList.ToArray());
             // call demo method
    }



 private async Task SendMessages()
         {
          var task = Task.Factory.StartNew(() => ProcessMessages()
           taskList.Add(task);
         }



private async Task ProcessMessages()
          {
           while (run for 10 minutes)
            {
             // data save
            }
          }

У меня есть added task into taskList и я использую Task.WaitAll(taskList.ToArray());, чтобы дождаться завершения всей задачи, а затем вызвать демонстрационный метод, но вместо ожидания и выполнения всего цикла, он сразу же отправляетсявниз после Task.WaitAll(taskList.ToArray()); и выполнить демонстрационный метод вызова почему?что я сделал не так?кто-нибудь может помочь?

1 Ответ

0 голосов
/ 23 января 2019

Task.Factory.StartNew не следует использовать для запуска асинхронных операций, поскольку он не разворачивает возвращенные Task и вместо этого возвращает новый Task, который завершается, как только запускается асинхронная операция (или, точнее, завершается) его синхронная часть). Вы должны использовать Task.Run вместо.

Кроме того, SendMessages не должно быть асинхронным. Тем не менее, Index должно быть, что позволяет использовать асинхронный WhenAll вместо блокировки WaitAll.

private List<Task> taskList = new List<Task>();

public async Task<ActionResult> Index()
{
     for (i = 0; i < 5; i++)
     {
         SendMessages();
     }

     await Task.WhenAll(taskList);
     // call demo method
}

private void SendMessages()
{
    var task = Task.Run(() => ProcessMessagesAsync());   // here
    taskList.Add(task);
}

private async Task ProcessMessagesAsync()
{
    while (run for 10 minutes)
    {
        // data save
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...