如何使用 C# 将 Task.WaitAll 与异步方法一起使用

How to make use Task.WaitAll with async method using C#

我在 HomeControllerasync 方法中使用了 Task.WaitAll,但它没有等待完成 async 方法的执行。我在这里做错了什么?它没有等待,而是立即转到下一条语句。

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

我在taskList中添加了一个Task并使用Task.WaitAll(taskList.ToArray());等待所有任务完成,然后call demo method。但是它并没有等待并执行整个循环,而是在 Task.WaitAll(taskList.ToArray()); 之后立即下降并执行 call demo method。这是为什么?

Task.Factory.StartNew 不应用于启动异步操作,因为它不会解包返回的 Task,而是 returns 一个新的 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
    }
}