【问题标题】:async await in if statement [duplicate]if语句中的异步等待[重复]
【发布时间】:2021-03-02 06:45:51
【问题描述】:

我是 C# 异步编程的新手,如果我的问题听起来很愚蠢,我很抱歉。下面是一些代码:

static async Task Main(string[] args) {
   var result = TestMethod(false);   //result is still Task<string> rather than string
}

public static async Task<string> TestMethod(bool check) {
   if (check) {
      await Task.Delay(8000);
      return "Hello World";
   } else {
      return "Goodbye World";   // no await in else statement
   }
}

所以TestMethod的else语句中没有await,代码怎么还能编译?据我了解,每个可能的路径都应该包含一个await 语句?

result仍然是Task&lt;string&gt;而不是string,但执行路径只到达else语句,直接返回一个字符串,怎么result还是一个任务?

【问题讨论】:

  • 该方法根本不需要任何await 语句! (如果没有,您会收到编译器警告,但代码仍会编译。)async 关键字允许您的方法使用await,但不要求它使用await .
  • 据我了解,每个可能的路径都应该包含一个 await 语句 ...不,这根本不是真的。
  • 这绝对是重复的,但是找不到
  • 执行到达等待,它向调用方法返回一个任务 ...不,这根本不是它的工作方式。 await 有效地告诉当前方法暂停,并释放它正在运行的线程,而正在等待的方法在另一个线程上执行。如果您有一个没有任何等待的异步方法,那么所发生的就是该方法完全在同一个线程中运行。
  • @amjad 编译器从根本上将所有async 方法更改为更复杂的方法,这些方法可以做很多事情(无论您是否正在利用它所做的所有工作)。所以它不是那么简单,但它会在所有情况下以某种方式返回一个新任务。

标签: c# async-await


【解决方案1】:

方法定义中的async 关键字向编译器发出信号,它应该返回一个任务,其结果将是方法的return 语句返回的任何结果。如果您删除 async 关键字,编译器将抱怨返回 string 而不是您所期望的 Task&lt;string&gt;

您可以阅读有关async 返回类型here 的Microsoft Docs。

这实际上不需要方法中的任何await 语句,但是如果删除await Task.Delay(8000); 行,您可能会看到一条警告,指出该方法将同步运行(假设您使用的是Visual Studio)。

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 2023-01-20
    • 1970-01-01
    • 2019-09-17
    • 2019-06-29
    • 1970-01-01
    • 2017-01-11
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多