我在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());
之后立即关闭并执行调用演示方法为什么?我做错了什么?有人可以帮忙吗?
答案 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
}
}