我在VB.NET中有以下代码,它读取激光的测量值,直到工件旋转480度。总而言之,CTP和RX结合在一起是一个非常好的应用。
Dim measurementsList = Await machine.
Measurements.
TakeUntil(machine.Driver.RotateC(480, 10).ToObservable()).
ToList()注在这种情况下,machine.Measurements是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没有提供如此明显的重载可能,我错过了这样的重载是一个坏主意的明显原因。我应该添加这个,还是坚持使用显式转换?
(顺便说一句,标签async-ctp和async-await不能合并)
发布于 2012-11-19 22:36:27
你所做的没有错,但我要回顾一下Rx v2.0 and .NET 4.5 “async” / “await” – a better together story,来自Bart De Smet的一篇冗长而内容丰富的帖子。
您可能还想查看一下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));https://stackoverflow.com/questions/13448592
复制相似问题