1

ワークピースが 480 度回転するまでレーザーから測定値を読み取る VB.NET の次のコードがあります。全体として、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

あなたがしていることに何も問題はありませんが、Rxv2.0と.NET4.5の「async」/「await」をレビューします。BartDeSmetによる長くて有益な投稿から、より良い一緒の話です。

また、 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 に答える