2013-04-08 5 views
5

why and when I would needをReactive Extension(Rx)for .NETを使用して理解しようとすると、「C# 5.0 async/await feature and Rx - Reactive Extensions」という質問になりました。後者の記事Task vs IObservable: when to use what?で参照.NETでReactive(Rx)拡張機能を使用しないとIOBservable <T>を使用できないのはなぜですか?

Reactive (Rx) extensions for .NET

の使用に同意語(または互換可能)IObservableの使用を参照しているようだ何、例えば、前述の記事からフレーズ:

IObservable

を返すように選択した場合、コードには反応的な内線番号が必要です。

Task<T>IObservable<T>は、Rxの参照や設定なしで私が使用している.NETの一部です。
IObservableをretuenするために反応的な内線番号が必要なのはなぜですか?

RXは、Task<T>とIObservableの議論で何をしなければなりませんか?
なぜそれらの使用法が並置されていますか?

答えて

13

実際には実装が容易であるためです。自分でIObservable<T>を実装しようとしないでください。 Rxには、適切かつ効率的に行う必要のあるすべての実装があります。

Rx design guidelinesは、IObservable<T>の実際のセマンティクスを指定します。 MSDN example implementationは完全に間違っています。

更新:MSDNのコード例は、以下のセマンティクス(参照番号は上記で参照文書から設計ガイドラインである)に失敗

  • Rxの文法を強制しません(4.1 )。
  • OnError(4.3)以降は自動的に登録を解除しません。
  • コーナーケース(6.1、6.2)を適切に処理できません。
  • OnErrorには中断セマンティクス(6.6)がありません。
  • サブスクリプションが破棄され、同じオブザーバーが再度サブスクライブされた場合、元のサブスクリプションはもはや冪等ではありません(6.17)。

カスタム実装では、TrackLocationへのすべての呼び出しがシリアル化されていることが前提です。 Rxの世界では、これはほとんど事実ではありません。

Rx Synchronize演算子でこれらの問題をすべて解決できることに注意してください。ただし、シリアル化された呼び出しについての仮定をまだTrackLocationにする必要があります。

+2

MSDNの実装が「完全かつ完全に間違っている」という理由については、素敵です:) – Eyvind

+0

技術的には、実装は「完全かつ完全に」古くなっています。 :)それはRx 1.0で書かれました。私たちは、すべてのドキュメントをrx.codeplex.com(オープンソースのRxコードベース全体を見つけることができます)に移動(および更新)しています。スティーブン、特定の問題を指摘してくれてありがとう! –

+0

@lindydonna、ご意見ありがとうございます。私はReactive Extensions(Rx)[v1.0.2856.104](http://www.microsoft.com/en-us/download/details.aspx?id=24940)+ [SP1](http:// www.microsoft.com/en-us/download/details.aspx?id=28568)しかし、[v.2.0](http://www.microsoft.com/en-us/download/details.aspx? VS2010/.NET4.0(Windows XP SP3)の[codeplexのもの](https://rx.codeplex.com/SourceControl/list/changesets)を含む)別の経験がありますか? –

1

IObservableとIObserverは、RxチームがRx用に作成したものです。NET Frameworkを使用することで、人々がそのインタフェースに対してプログラムを作成し、IObservableをライブラリに公開することができます。ただし、IObservableですべてのRxアセンブリを自動的に要求する必要はありませんが、それらを消費するか、またはRxを使用します。

IObservableとIObserverは、数学的には二重です(矢印、パラメータと戻り値の流れ、賢明な方法で反転された方向)、IEnumerableとIEnumeratorになります。同様に、MoveNextとCurrentのほかにIEnumerableをあまり使っていないのと同様に、これらのメソッド(実際にはメソッドとプロパティ)をラップするforeachステートメントを使用しますが、LINQはIEで機能するあらゆる種類の拡張メソッドを提供します。サブスクリプションをBCLに実装することは可能でしょうが、おそらくそれを行うようなforeach文を追加することもできますが、すぐに他のもののユーティリティが必要であることがわかりますIO。

関連する問題