让我说我跑RunSynchron()
。在这种情况下,它运行Delay()
,暂停10秒,然后继续执行程序。完成Delay()
后,它会返回if
- 语句的值1。但为什么我必须返回Task<int>
而不是int
?
class Synchron
{
public async void RunSynchron()
{
var delay = this.Delay();
Console.WriteLine("Now we wait...");
Console.WriteLine("But we can continue with our work");
if(await delay == 1)
Console.WriteLine("Now it's done");
}
public async Task<int> Delay()
{
await Task.Delay(10000);
return 1;
}
}
答案 0 :(得分:0)
因为async
关键字只是返回任务的方法的语法糖。这是它的定义。
在引擎盖下,当编译器在同一个方法调用上遇到await
时,它将添加完整的异步调用并等待任务完成。因此,编译器需要Task<int>
来为您构造代码,最终编译的代码。
请注意,await
后面的代码被编码为从方法返回的任务的任务延续。如果你自己编写它,那里有很多样板文件。这就是async/await
关键字如此有用的原因。
答案 1 :(得分:0)
因为函数不返回整数,而是一个Task以后再返回一个整数。如果函数返回一个整数,你可以像调用函数一样调用函数,但这比实际执行的代码更像是一种语法特性。
答案 2 :(得分:0)
async
/ await
功能的设计是一个不幸的方面,async
似乎是声明的一部分方法。
我说不幸是因为它是关于该方法的实现细节 - 具体来说,它改变了这种方法中可能出现的代码的性质,因此允许await
s出现并将适当处理。
它不会更改方法的签名(事实上,它在接口声明中是不允许的)。因此,如果你有一个方法可以返回&#34;某些东西&#34;,并且在稍后的某个时间点返回&#34;某些东西&#34;可以转换为int
,但您没有描述返回int
的方法。在您的示例中,您将存储&#34;某些内容&#34;在您的delay
变量中。那时它不是int
- 只是稍后可以转换为int
的内容。
他们可以选择async
&#34;更多魔术&#34;通过让它隐式更改方法签名以将结果包装在Task
中 - 但这会使实际返回类型对于临时检查不那么明显。如果想要将方法从async
转换为非async
或反之亦然(您还必须编辑返回类型),还需要更多实际编辑。