我的问题是当一个Task有一个Task.WhenAll()调用(运行其他任务)时,WhenAll()行让消费代码继续执行,这与我的预期不同。因此,当命中Task.WhenAll()时,以下代码立即输出“finished”,而不是在其参数中的所有任务完成后输出。
// Just a simple async method
public Task DoWorkAsync()
{
return Task.Factory.StartNew(
() =>
{
// Working
});
}
// This one used the previous one with Task.WhenAll()
public Task DoLoadsOfWorkAsync()
{
return Task.Factory.StartNew(
async () =>
{
// Working
// This line makes the task return immediately
await Task.WhenAll(DoWorkAsync(), DoWorkAsync());
// Working
});
}
// Consuming code
await DoLoadsOfWorkAsync();
Console.WriteLine("finished");
我希望在执行DoLoadsOfWorkAsync()的最后一行时调用WriteLine()。
我做错了什么?提前谢谢。
答案 0 :(得分:18)
Task.WhenAll
立即返回一个新的Task
,它不会阻止。传递给WhenAll
的所有任务都已完成后,返回的任务将完成。
它是Task.WaitAll
的异步等价物,如果你想阻止它,这就是使用的方法。
但是你有另一个问题。使用Task.Factory.StartNew
并传递async
委托似乎导致一种Task<Task>
类型,其中外部任务在内部任务开始执行时完成(而不是在完成时)。
使用较新的Task.Run
可以避免这种情况。