我在VB.NET中有以下代码从a读取测量值 激光直到工件旋转480度。总而言之 一个非常好的CTP和RX应用程序。
Dim measurementsList = Await machine.
Measurements.
TakeUntil(machine.Driver.RotateC(480, 10).ToObservable()).
ToList()
注意机器。在这种情况下,测量是IObservable(双倍)并且是 来自网络上的激光测量设备的读数。
但是我正在考虑向IObserverable添加扩展方法 (现在C#代码)
public static IObservable<T> TakeUntil<T,R>(this IObservable<T> This, Task<R> other){
return This.TakeUntil(other.ToObservable());
}
这真的不是什么大问题,我可以把我的代码写成
Dim measurementsList = Await machine.
Measurements.
TakeUntil(machine.Driver.RotateC(480, 10)).
ToList()
看起来更流畅,但鉴于RX没有提供这样的 显而易见的超载perhapps我错过了这样一个明显的原因 超载是个坏主意。我应该添加这个还是坚持使用显式 转化
(顺便说一句,不应该将标签async-ctp和async-await合并)
答案 0 :(得分:3)
你正在做的事情没有错,但我会从Bart De Smet的冗长而翔实的帖子中回顾Rx v2.0 and .NET 4.5 “async” / “await” – a better together story。
您可能还想查看Linq-to-Await,了解其中的工作方式。事实上,如果你看一下这几个算子,你就会发现你的方法非常相似,除非在你的情况下你只需要一个任务,在Paul Betts Linq-To-Await,他使用Func<T, Task<R>>
。在这种情况下,您的代码可能如下所示(使用没有参数的Func):
public static IObservable<T> TakeUntil<T,R>(this IObservable<T> This, Func<Task<R>> other){
return This.TakeUntil(other().ToObservable());
}
var q = Measurements.TakeUntil(async () => await machine.Driver.RotateC(480, 10));