Task 或Task 对象是可等待的,因此我们可以对返回值为Task 或Task 的对象使用await 键。
Task 或 Task 是最常用的可等待对象。
我们还可以定义自己的可等待对象。该对象应该具有以下资格。
- 它有一个 GetAwaiter() 方法(实例方法或扩展方法);
- Its GetAwaiter() method returns an awaiter. An object is an awaiter
if:
- 它实现 INotifyCompletion 或 ICriticalNotifyCompletion
界面;
- 它有一个 IsCompleted,它有一个 getter 并返回一个布尔值;
- 它有一个 GetResult() 方法,该方法返回 void 或结果。
我的问题是,为什么微软不提供一个接口来约束这些可等待的对象?
当前实现可等待对象的方法有点复杂。
Lucian Wischik 的博客文章给出了最好的回答为什么异步方法必须返回 Task? http://blogs.msdn.com/b/lucian/archive/2012/11/22/why-must-async-methods-return-task.aspx
总而言之(我并没有公正地对待这篇博文,你应该阅读它),问题是Task
已经存在,所以引入一个接口意味着
- 所有内部方法都需要更改为接口,这是一个重大更改,因此框架人员几乎不可能愿意这样做。
- 作为一名程序员,你经常需要决定是否要返回
Task
或者界面,这个决定并不重要。
- 编译器总是需要一个具体类型,因此即使您从方法返回一个接口,它仍然会被编译为
Task
.
上述影响是如此之大,以至于提供一个接口是没有意义的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)