pik*_*usp 3 c# asynchronous async-await
当我们调用异步方法时,我们会返回一个包装器任务。
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();
}
Run Code Online (Sandbox Code Playgroud)
如果我从未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}");
Run Code Online (Sandbox Code Playgroud)
结果:
Returned task: True
Awaited task: True
Returned task: True
Awaited task: True
Task from WhenAll: True
Run Code Online (Sandbox Code Playgroud)
所以:是的,如果异步方法同步运行,则返回的Task完成。是的,从 WhenAll 返回的 Task 传递同步运行的异步方法也完成了。
Stephen Cleary 写了一篇关于这个主题的有用的博客。具体而言,以下引用是相关的:
异步方法的开头就像任何其他方法一样执行。也就是说,它会同步运行,直到遇到“await”(或抛出异常)。
“await”关键字是事情可以异步的地方。Await 就像一个一元运算符:它接受一个参数,一个 awaitable(一个“awaitable”是一个异步操作)。Await 检查该 awaitable 以查看它是否已经完成;如果 awaitable 已经完成,则该方法将继续运行(同步,就像常规方法一样)。
从规格方面解决问题:
从这些语句可以得出结论,同步运行的异步方法确实会返回一个已完成的任务。
即使在执行异步方法时抛出异常,返回的任务也将完成(“IsCompleted”将返回“true”,而“IsCompletedSuccessfully”将返回“false”)。
| 归档时间: |
|
| 查看次数: |
752 次 |
| 最近记录: |