【发布时间】:2019-06-17 10:09:56
【问题描述】:
我在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。这是为什么呢?
【问题讨论】:
-
还有
private List<Task> taskList = new List<Task>();一行吗?Index中定义的当前一个不能被SendMessages访问以添加任务。所以看起来你正在等待一个空的任务列表。此外,您应该使用await Task.WhenAll而不是阻塞WaitAll -
抱歉
taskList它在 index() 之外 -
@Neo,你是如何在 ProcessMessages 中实现
run for 10 minutes逻辑的? -
var startTime = DateTime.UtcNow; while (DateTime.UtcNow - startTime < TimeSpan.FromMinutes(10)) -
@Neo,等待 10 分钟的逻辑不应该是:
while((DateTime.UtcNow - startTime).TotalMinutes < 10)。您提到的代码没有等待 10 分钟,因此您看到 WaitAll 方法不会导致等待 10 分钟。
标签: asp.net-mvc c#-4.0 async-await task task-parallel-library