我的问题是,当任务有 Task.WhenAll() 调用(运行其他任务)时,WhenAll() 行使消耗代码继续执行,这与我的预期不同。因此,下面的代码在调用 Task.WhenAll() 时立即输出“完成”,而不是在其参数中的所有任务完成后。
// 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() 。
我究竟做错了什么?提前致谢。
Task.WhenAll返回一个新的Task立即,它不会阻塞。当所有任务都传递到时,返回的任务将完成WhenAll
已完成。
它是一个异步等价于Task.WaitAll,如果您想阻止,则可以使用此方法。
但是你还有另一个问题。使用Task.Factory.StartNew并通过一个async
delegate 似乎会导致一种Task<Task>
当内部任务开始执行时(而不是完成时),外部任务完成。
使用较新的Task.Run避免了这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)