1

我在 VB.NET 中有以下代码,它从激光读取测量值,直到工件旋转 480 度。总而言之,CTP 和 RX 的一个非常好的应用程序。

Dim measurementsList = Await machine.
    Measurements.
    TakeUntil(machine.Driver.RotateC(480, 10).ToObservable()).
    ToList()

注意 machine.Measurements 在这种情况下是 IObservable(of double) 并且是来自网络上的激光测量设备的读数。

但是我正在考虑向 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 不应该合并)

4

1 回答 1

3

你所做的事情并没有错,但我会回顾一下Rx v2.0 和 .NET 4.5 “async”/“await”——一个更好的共同故事,来自 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));
于 2012-11-19T14:36:26.917 回答