C# wait Task.WhenAll()在未等待的任务中
我的问题是,当一个任务有一个Task.WhenAll()调用(运行其他任务)时,WhenAll()行使消费代码继续执行,这与我预期的不同。因此,下面的代码在点击Task.WhenAll()时立即输出“finished”,而不是在其参数中的所有任务都完成之后C# wait Task.WhenAll()在未等待的任务中,c#,task-parallel-library,async-await,C#,Task Parallel Library,Async Await,我的问题是,当一个任务有一个Task.WhenAll()调用(运行其他任务)时,WhenAll()行使消费代码继续执行,这与我预期的不同。因此,下面的代码在点击Task.WhenAll()时立即输出“finished”,而不是在其参数中的所有任务都完成之后 // Just a simple async method public Task DoWorkAsync() { return Task.Factory.StartNew( (
// 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()
我做错了什么?提前感谢。立即返回一个新的,它不会阻塞。当所有传递到的任务都已完成时,返回的任务将完成
它是与的异步等效,如果要阻止,则使用此方法
然而,你还有另一个问题。使用和传递async
委托似乎会导致一种类型的任务
,其中外部任务在内部任务开始执行时完成(而不是在内部任务完成时)
使用较新版本可以避免这种情况。你说得对:问题在于任务,我忽略了它。顺便说一句,我不希望线程阻塞,只希望在前面的任务完成后继续执行。这就是为什么我使用Task.WhenAll()而不是与aync wait构造一起使用wait。非常感谢你的帮助!如果您想了解Task.Run
及其所有优点(以及它为什么和如何完成任务),请点击此处: