我有以下代码:
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(任务)停止,但即使这样也不会完成所有任务。我该如何解决这个问题?
答案 0 :(得分:1)
首先,为什么你为循环中的每个任务浪费线程池,你的代码可以写成:
public Task<bool> ExecuteAsync()
{
return ItReturnsATask();
}
public async Task DoSomethingAsync()
{
var tasks = new List<Task>();
foreach (var item in someList)
{
//ExecuteAsync can be replace by ItReturnsATask if there's no extra processing
tasks.Add(ExecuteAsync());
}
await Task.WhenAll(tasks);
}
你的代码错过了异步点,它从线程池创建了几个线程,并使用它们,这些线程浪费在这里。至于你的实际问题,await Task.WhenAll(tasks)
之后的任何事情都没有在所有任务完成之前执行(假设我们正在捕获当前上下文)。