bra*_*ing 5 c# asynchronous system.reactive async-await c#-7.0
C#7已经出局,我看到他们已经打开了异步 等待关键字以允许任何你想要的东西.然而,API的表面积看起来非常大,我不确定其局限性.具体来说,如果可能,我很感兴趣
int RandomNumber(){..}
public async IObservable<int> Generate(){
while(true){
await Observable.Timer(TimeSpan.FromSeconds(1)).Select(_=>RandomNumber());
await Observable.Timer(TimeSpan.FromSeconds(2)).Select(_=>10);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为相当于
public IObservable<int> Generate(){
return Observable.Timer(TimeSpan.FromSeconds(1)).Select(_=>RandomNumber())
.Concat(Observable.Timer(TimeSpan.FromSeconds(2)).Select(_=>10))
.Replay();
}
Run Code Online (Sandbox Code Playgroud)
Reddit上有一个链接,前面讨论了为什么异步等待可以像f#计算表达式一样强大,只要它们被允许.
我猜不会(目前):
编译器必须以某种方式将你的代码拼接成一个具体的类型来构造和返回。IObservable<T>不是类型,因此编译器无法构造它。
另外,从 7.0发行说明开始:
新的语言功能意味着异步方法可以返回除 Task、Task 和 void 之外的其他类型。返回的类型仍必须满足异步模式,这意味着 GetAwaiter 方法必须可访问。
这并不是说有人无法构建一个ObservableTask<T>或某个东西来实现IObservable<T>并满足任务 API 的要求。它只是还没有完成。
您仍然会遇到不匹配的问题:Task<T>围绕返回 0-1T对象,IObservable<T>返回 0-nT对象。