mat*_*thk 1 c# asynchronous language-design return-type
想知道为什么我们应该指定该async方法确实返回Task对象.
指定它似乎是多余的async关键字加上它是混乱,因为你没有真正创建Task对象.
据我所知,编译器会为Task对象创建发出必要的代码(无论是在等待调用还是用新任务包装返回).
我真的不喜欢声明类型和返回类型之间的不一致.
这不是一个真正的问题:它更像是一个咆哮,因此不是特别适合StackOverflow:
我真的不喜欢声明类型和返回类型之间的不一致.
如果你想抱怨,可以开始写博客并抱怨.让我们重新提出这个问题:
async方法返回的声明类型可能是,Task<int>但是该return方法中的语句返回的表达式必须可以隐式转换为int,而不是Task<int>.这可能令人困惑.什么样的设计原则证明了这种行为?
你是对的,这可能令人困惑.这是令人困惑的,因为async方法将我们非常习惯的两件事分开作为一件事.这两件事是:
在同步方法中,这两件事总是相同的,因为调用者中的恢复点是同步方法的延续.但是异步方法的重点是调用者中的代码不是方法的延续.通过设置与其关联的任务的继续来控制方法的继续.
这就是声明的返回类型和赋予return语句的类型不同的原因.调用者想要一个,Task<int>但方法的延续想要一个int.该return语句表示"此方法已完成;无论该方法是同步还是异步,都将此值赋予我的继续".
听起来你问为什么public async int MyMethodAsync()不会自动编译为实际返回的方法Task<int>.
答案是最小惊喜的原则:方法签名中声明的返回类型始终是实际的返回类型.
这样,当您读取方法声明时,您始终可以知道调用方法时看到的实际返回类型,而无需查看修饰符并记住特殊规则.