【发布时间】:2018-05-29 18:21:36
【问题描述】:
我有以下代码:
public async Task<bool> ExecuteAsync()
{
return await someresult;
}
public async Task DoSomethingAsync()
{
var tasks = new List<Task>();
foreach (var item in someList)
{
var task = Task.Factory.StartNew(async () =>
{
await ExecuteAsync();
});
tasks.Add(task);
}
await Task.WhenAll(tasks);
// The program execution should stop here and next code should be run when all tasks are completed
}
基本上我在一个 foreach 循环中,我为每个项目启动一个新任务。
一旦所有任务都启动,我希望在所有任务完成后执行await Task.WhenAll(tasks); 之后的代码。当然所有都是异步的,因此我想知道这是否可能?因为所有都是异步的,所以执行不会在 Task.WhenAll(tasks) 处停止,而是会继续,即使并非所有任务都已完成。我该如何解决这个问题?
【问题讨论】:
-
你为什么使用
Task.Factory.StartNew?您是否停留在 .NET 4.0 上?如果没有,请改用Task.Run -
另外,
async () => await ExecuteAsync()没有意义,你必须使用Task.Run(() => ExecuteAsync) -
StartNew 不直接支持异步 Lambadas。
task的类型将是Task<Task<bool>>,而WhenAll的行为将不符合您的预期。使用 Task.Run 或者您需要在将其添加到列表之前调用.Unwrap()。 -
@CamiloTerevinto:我的理解是您不应该在循环中运行 Task.Run。我错了吗?
-
@user2818430
Task.Run在正常情况下优于Task.Factory.StartNew
标签: c# async-await task multitasking