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