LINQ to Events a.k.a RX Frameworkとは何ですか?
-
10-07-2019 - |
質問
LINQ to event a.k.a RX Framework 別名.NET 4.0のReactive Extensions(ただし、バックポートバージョンとしても利用可能)
つまり、System.Reactive.dllのすべての機能は何のためですか?
解決
.NET Rxチーム(これは正式名称ではありません)は、プッシュシーケンス(イベント、コールバック)をプルシーケンス(列挙型にアクセスするときに通常行うように)としても表示できることを発見しました。 。短いオブザーバー/オブザーバブルパターンでは、列挙パターンのデュアルです。
それでは、この二重性の素晴らしいところは何ですか?
プルシーケンス(宣言型コーディングを読む)で行うことはすべて、プッシュシーケンスにも適用できます。ここにいくつかの側面があります。 既存のイベントからObservablesを作成し、それらを.NETのファーストクラスの市民として使用できます。つまり、イベントからObservableを作成し、それをプロパティとして公開できます。
IObservableはIEnumerableの数学的な双対であるため、.NET RxはLINQ over IEnumerablesのように、イベントなどのプッシュシーケンスでLINQを容易にします
新しいイベントを自由に作成できます。一般的なイベントから特定のイベントを作成できます。
.NET Rxは、「イベントソースとシンクのプロデューサーとコンシューマーとして入力アダプターと出力アダプターを使用する代わりとなる」2つのインターフェイス、IObservableとIObserverを導入しています。そして、これはまもなく宣言的な方法で非同期コードを書くための事実上のものになります。以下に簡単な例を示します。
//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://tomasp.net/articles/reactive-ii-csevents.aspx
基本的には、マウスの動きのイベントハンドラーを作成する場合、これらのイベントを連続的にキャプチャし、おそらく何回の動きまたはクリックをカウントできるかがわかりますが、基本的には、その情報をイベントハンドラー以外の方法で使用することもできます。そのため、イベントを連続ストリームとして扱うだけです。
また、このチャンネル9のビデオもご覧ください:エキスパートのエキスパート:ブライアンベックマンとエリックメイジャー-.NET Reactive Framework(Rx)の内部
番組の説明から:
.NET Reactive Framework(Rx)は、LINQと オブジェクト。のペアで構成されています インターフェイスIObserver / IObservable プッシュベース、またはオブザーバブルを表します コレクション、およびライブラリ を実装する拡張メソッド LINQ標準クエリ演算子と その他の便利なストリーム変換 関数。
RXの本質は、情報を見る角度を変えると思います。当然のことながら、すべての情報は何らかのプロセスの結果であり、時空間の連続で発生します。従来のアプローチでは、プロセスを "current" "タイムプレーンに投影し、結果として時間ディメンションの詳細を失います。
RXは他の次元への投影と連携して時間コンポーネントもキャプチャするため、LINQ to RXが通常のLINQのスーパーセットであるのも不思議ではありません。