c# - 调用异步方法的两种方式。C#
问题描述
这两种方法有区别吗?或者程序在这两种情况下运行类似?如果有差异,你能说这些差异是什么。
第一种方法:
Task myTask = MyFunctionAsync();
await myTask;
第二种方法:
await MyFunctionAsync();
解决方案
简短版:“不是真的,至少不是以有趣的方式”
长版本:可等待对象不限于Task
/ Task<T>
,因此可以(实际上是微不足道的)创建可以正常编译的代码:
await MyFunctionAsync();
但不编译:
Task myTask = MyFunctionAsync();
await myTask;
仅仅因为MyFunctionAsync()
返回不是任务的东西。ValueTask<int>
就足够了,但如果你愿意,你可以制作异国情调的等待。但是:如果我们替换Task
为var
,即
var myTask = MyFunctionAsync();
await myTask;
那么现在唯一的区别是我们可以myTask
在代码中的其他点引用,如果我们愿意的话。这并不少见。两个主要场景是
- 结合对并发代码的多项检查,可能使用
WhenAny
或WhenAll
- (通常情况下
ValueTask[<T>]
)检查 awaitable 是否同步完成,以避免同步情况下的状态机开销
推荐阅读
- linux - 如何使用 printf 打印多个变量
- visual-studio - 为什么我的 SSIS 工具箱在 Visual Studio 2019 社区中为空?
- html - 在 flexbox 实现的第二列中创建一个可滚动的 div
- python - Python- 类实例问题(init 需要五个参数;只传递两个)
- powershell-5.0 - Select-Object -Property 参数防止在循环中获取对象
- ajax - Laravel - 如何使用 Ajax 将数据从复选框按钮发送到控制器
- google-apps-script - 将一个 Google Doc 的全部内容插入到另一个的评论中
- css - 如何定位特定的 h1 标头
- swift - 如何快速修复“getDataInBackgroundWithBlock”错误
- javascript - 在 Google 表格中输入数据后自动保护单元格/范围