首页 > 解决方案 > 调用异步方法的两种方式。C#

问题描述

这两种方法有区别吗?或者程序在这两种情况下运行类似?如果有差异,你能说这些差异是什么。

第一种方法:

Task myTask = MyFunctionAsync();
await myTask;

第二种方法:

await MyFunctionAsync();

标签: c#async-awaittask

解决方案


简短版:“不是真的,至少不是以有趣的方式”

长版本:可等待对象不限于Task/ Task<T>,因此可以(实际上微不足道的)创建可以正常编译的代码:

await MyFunctionAsync();

但不编译:

Task myTask = MyFunctionAsync();
await myTask;

仅仅因为MyFunctionAsync()返回不是任务的东西。ValueTask<int>就足够了,但如果你愿意,你可以制作异国情调的等待。但是:如果我们替换Taskvar,即

var myTask = MyFunctionAsync();
await myTask;

那么现在唯一的区别是我们可以myTask在代码中的其他点引用,如果我们愿意的话。这并不少见。两个主要场景是

  • 结合对并发代码的多项检查,可能使用WhenAnyWhenAll
  • (通常情况下ValueTask[<T>])检查 awaitable 是否同步完成,以避免同步情况下的状态机开销

推荐阅读