如何使用 C# 将 Task.WaitAll 与异步方法一起使用
How to make use Task.WaitAll with async method using C#
我在 HomeController
的 async
方法中使用了 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
}
}
我在 HomeController
的 async
方法中使用了 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
}
}