我刚刚注意到await
关键字可以与 Rx Observable 一起使用,例如:
await Observable.Interval(TimeSpan.FromHours(1));
我非常确定它只能与任务结合使用。
那么是什么让它成为可能呢?可观察到的知识是否硬编码到编译器中?
不,编译器没有特殊知识IObservable<T>
。根据 C# 5 规范第 7.7.7.1 节,如果对象有一个方法或者在名为 的范围内有一个扩展方法GetAwaiter
返回一个实现的类型System.Runtime.CompilerServices.INotifyCompletion
,可以等待。请参阅 Steven Toub 的文章,等待任何事情.
更具体地说,从规范
await 表达式的任务必须是可等待的。一种表达t is 等待的如果以下条件之一成立:
- t是编译时类型动态
- t有一个名为 GetAwaiter 的可访问实例或扩展方法,不带任何参数和类型参数,并且返回类型 A 满足以下所有条件:
1. A 实现接口 System.Runtime.CompilerServices.INotifyCompletion(以下简称 INotifyCompletion)
2. A 有一个可访问、可读的 bool 类型实例属性 IsCompleted
3. A有一个可访问的实例方法GetResult,没有参数,也没有类型参数
请注意这与如何相似foreach
不需要IEnumerable<T>
但只是一个返回兼容对象的 GetEnumerator 方法。这种鸭子类型是一种性能优化,允许编译器在不装箱的情况下使用值类型。这可用于避免性能敏感代码中不必要的分配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)