Плохо ли добавить метод расширения Observable.TakeUntil(Task task)?

У меня есть следующий код в VB.NET, который считывает измерения с лазера до тех пор, пока заготовка не повернется на 480 градусов. В целом, очень хорошее приложение CTP и RX вместе.

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

Обратите внимание, что machine.Measurements в этом случае имеет значение IObservable(of double) и является показаниями лазерного измерительного устройства в сети.

Однако я рассматривал возможность добавления метода расширения в IObserverable (теперь код С#)

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)


person bradgonesurfing    schedule 19.11.2012    source источник


Ответы (1)


В том, что вы делаете, нет ничего плохого, но я бы проверил Rx v2.0 и .NET 4.5 "async" / "await" — рассказ о лучшем сотрудничестве из длинного и информативного поста Барта Де Смета.

Вы также можете проверить Linq-to-Await, чтобы узнать, как там все делается. На самом деле, если вы посмотрите на несколько операторов, вы увидите, что ваш метод очень похож, за исключением того, что в вашем случае вы берете только задачу, где в Поле Беттсе 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));
person DoctorFoo    schedule 19.11.2012