如何使用C#通过异步方法使用Task.WaitAll

时间:2019-01-23 18:40:20

标签: c# .net asp.net-mvc c#-4.0

我在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 :(得分:1)

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
    }
}