添加Observable.TakeUntil(任务任务)扩展方法是一个坏主意吗?

时间:2012-11-19 06:16:32

标签: vb.net system.reactive async-await async-ctp

我在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合并)

1 个答案:

答案 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));