LINQ to events、別名RX Framework、別名Reactive Extensions in .NET 4.0(ただし、バックポートバージョンとしても利用可能)とは何ですか?
言い換えれば、System.Reactive.dllのすべてのものは何のためのものですか?
LINQ to events、別名RX Framework、別名Reactive Extensions in .NET 4.0(ただし、バックポートバージョンとしても利用可能)とは何ですか?
言い換えれば、System.Reactive.dllのすべてのものは何のためのものですか?
.NET Rx チーム (これは正式名称ではありません) は、すべてのプッシュ シーケンス (イベント、コールバック) をプル シーケンス (列挙型にアクセスするときに通常行うように) と同様に表示できることを発見しました。つまり、それらは本質的にデュアルです。要するに、オブザーバー/オブザーバブル パターンは、列挙型パターンの双対です。
では、この二元性の何がクールなのでしょうか?
プル シーケンス (宣言型コーディングを参照) で行うことはすべて、プッシュ シーケンスにも適用できます。ここにいくつかの側面があります。既存のイベントから Observable を作成し、それらを .NET のファースト クラス シチズンとして使用できます。つまり、イベントから Observable を作成し、それをプロパティとして公開できます。
IObservable は IEnumerable の数学的な双対であるため、.NET Rx は、IEnumerables を介した LINQ と同様に、イベントのようなプッシュ シーケンスを介した LINQ を容易にします。
これにより、新しいイベントを作成する自由度が高まります。一般的なイベントから特定のイベントを作成できます。
.NET Rx は、IObservable と IObserver の 2 つのインターフェイスを導入します。これは、「入力アダプターと出力アダプターをイベント ソースとシンクのプロデューサーおよびコンシューマーとして使用する代わりの方法を提供します」。これは、宣言的な方法で非同期コードを記述するためのデファクトになるでしょう。これが簡単な例です。
//Create an observable for MouseLeftButtonDown
var mouseLeftDown=Observable.FromEvent<MouseButtonEventArgs>
(mycontrol,"MouseLeftButtonDown");
//Query the above observable just to select the points
var points = from ev in mouseEvents
select ev.EventArgs.GetPosition(this);
//Show points in the window's title, when ever user
//presses the left button of the mouse
points.Subscribe(p => this.Title = "Location ="
+ p.X + "," + p.Y);
これらの投稿を参照して、頭と尾を詳細に取得することもできます. 関連するソース コードも参照してください。
詳細については、こちらをご覧ください: http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html
F# に関する彼の本を読んでいるときに、私が最初に触れたのはこのブログでした: http://toasp.net/articles/reactive-ii-csevents.aspx
基本的に私の理解では、たとえば、マウスの動きのイベントハンドラーを作成する場合、これらのイベントを継続的にキャプチャしたい場合があり、おそらく動きやクリックの数を数えることができますが、基本的にはそれを使用したいイベント ハンドラーとしてだけでなく、さまざまな方法で情報を提供します。したがって、イベントを継続的なストリームとして扱います。
また、次の Channel 9 ビデオもご覧ください: Expert to Expert: Brian Beckman と Erik Meijer - Inside the .NET Reactive Framework (Rx)
番組説明より:
.NET Reactive Framework (Rx) は、LINQ to Objects の数学的双対です。これは、プッシュベースの、または監視可能なコレクションを表す IObserver/IObservable インターフェイスのペアと、LINQ 標準クエリ演算子およびその他の便利なストリーム変換関数を実装する拡張メソッドのライブラリで構成されます。
RXの本質は、情報の見方を変えることにあると思います。当然のことながら、すべての情報は時空間連続体で行われる何らかのプロセスの結果です。従来のアプローチは、 「現在の」時間平面へのプロセスの投影で機能し、結果として時間次元の詳細を失います。
RX は、他の次元への射影と連携して時間コンポーネントもキャプチャするため、LINQ to RX が通常の LINQ のスーパーセットであることは不思議ではありません。