当我们调用异步方法时,我们返回一个包装器任务。
public async Task ExecuteActionAsync() {
// no await called
}
public async Task ExecuteActionAwaitAsync() {
// await called on a completed
await Task.CompletedTask;
}
public async Task MyMethod(){
await ExecuteActionAsync();
await ExecuteActionAwaitAsync();
}
如果我从未await
在函数(ExecuteActionAsync
)中使用关键字,或者在ExecuteActionAwaitAsync
我们等待它们时所有在函数()中等待的任务已经完成,那么我是否可以保证通过调用这些方法返回的任务将处于完成状态?并且递归地,由它返回的任务MyMethod
也将处于完成状态,因为它满足了前面提到的条件(等待完成的任务)。我相信我已经读到了可以解决这种情况的优化方法,但是现在无法在任何地方找到它。
额外的问题:调用Task.WhenAll
完成的任务是否会返回完成的任务?
这很容易测试:
var t1 = ExecuteActionAsync();
Console.WriteLine($"Returned task: {t1.IsCompleted}");
await t1;
Console.WriteLine($"Awaited task: {t1.IsCompleted}\n");
var t2 = MyMethod();
Console.WriteLine($"Returned task: {t2.IsCompleted}");
await t2;
Console.WriteLine($"Awaited task: {t2.IsCompleted}\n");
t1 = ExecuteActionAsync();
t2 = MyMethod();
var t3 = Task.WhenAll(new []{t1,t2 });
Console.WriteLine($"Task from WhenAll: {t3.IsCompleted}");
结果:
Returned task: True
Awaited task: True
Returned task: True
Awaited task: True
Task from WhenAll: True
因此:是的,如果async方法同步运行,则返回的Task已完成。是的,从WhenAll返回的传递同步运行的异步方法的任务也已完成。
Stephen Cleary撰写了有关此主题的有用博客。具体来说,以下引用是相关的:
异步方法的开始就像其他方法一样被执行。也就是说,它会同步运行,直到达到“ await”(或引发异常)为止。
“ await”关键字是事物可以异步进行的地方。Await就像一元运算符:它接受一个参数,一个awaitable(“ awaitable”是一个异步操作)。Await检查该等待项是否已经完成;如果等待已完成,则该方法将继续运行(与常规方法一样同步)。
从规范方面着手解决问题:
从这些语句可以得出结论,同步运行的异步方法确实会返回完成的Task。
即使在执行async方法时引发异常,返回的Task也将完成(“ IsCompleted”将返回“ true”,尽管“ IsCompletedSuccessfully”将返回“ false”)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句