「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>非同期処理]] * 目次 [#m7f7c90c] #contents *概要 [#vc8c9a9d] -Observer パターンを実装するフレームワークだが、 -特に、[[LINQ]] to Eventsもしくは[[LINQ]] to Asynchronusと表現できる。 -これは、要するに、 --イベントや非同期処理を[[LINQ]]っぽく扱える。 --非同期 / イベント / 時間に関する処理を[[LINQ]]的に簡潔かつ宣言的に記述できる。 >と言うトコロを意味する。 **ユースケース [#n666c1c9] ***Observer パターンの実装 [#yd1a26a2] ***[[LINQ]](フィルタ、変換、集計、合成) [#hc013262] 通知に対して、[[LINQ]](フィルタ、変換、集計、合成)を適用できる。 ***イベントの[[LINQ]]化 [#h619212e] イベントにObserver パターンを適用して、~ [[LINQ]](フィルタ、変換、集計、合成)を適用できる。 ***非同期の[[LINQ]]化 [#k6c0a005] -イベントにObserver パターンを適用して、~ [[LINQ]](フィルタ、変換、集計、合成)を適用できる。 -具体的には、Observerを合成してネストを処理が可能。 **経緯 [#pbb87a6d] -Silverlight Toolkitに"System.Reactive.dll"が同梱される。 -Reactive Framework ---> Reactive Extensionsと名称変更。 -DevLabs(昔のMSコミュニティサイト)でプロジェクト公開~ ソースコードは恐らくCodePlexで公開されていた。 -何度もAPIの消滅・追加を繰り返す。 -JavaScript版が登場 -.NET Framework 4 SP1に標準搭載 *詳細 [#yb022a76] Observer パターンで構成される。 -何らかの[[Provider>#cf10344e]](IObservable<T>など)で監視を行い、 -[[Provider>#cf10344e]]から状態のPush(=通知、発行、イベント)を、 -[[Subscriber>#v5cd7d2c]](IObserver<T>など)が受け取る。 **Subscriber [#v5cd7d2c] IObserver<T>を実装したクラスを定義する。 **Provider [#cf10344e] -IObservable<T> を実装したクラスを定義する。 -クラスは[[ラムダ式>ラムダ式って]]を使用したメソッドチェーンで実装できる。 ***開始 [#sb94cfa0] -Createなどの生成メソッドで生成、 |#|メソッド|概要|h |1|Create|監視内容を定義する。| |2|Return|渡した値を単純に通知する。| |3|Range|正指定した範囲の値を通知する。| |4|Repeat|第1引数で渡したデータを、&br;第2引数で指定した回数繰り返して通知する。| |5|Generate|for 文的に以下を定義する。&br;・初期値&br;・継続判定デリゲート&br;・インクリメント・デリゲート&br;・通知する値を生成するデリゲート| |6|Case|複数用意された IObservable の中から、どれか1つを選択。&br;・IObservable配列&br;・IObservable選択デリゲート| |7|Throw|例外を通知する。| |8|Start|渡した値を非同期で通知する。| |9|Defer|Providerのファクトリを実装。| -Createで生成する場合、以下のメソッドを使用して監視内容を定義する。 |#|メソッド|概要|h |1|OnNext|新しい値が発生したことを通知する。| |2|OnError|エラーが発生し、異常終了したことを通知する。| |3|OnCompleted|正常に終了したことを通知する。| -必要に応じて、[[LINQ]]メソッドを使用し通知内容を操作できる。 --Where(フィルタリング) --Select(変換) --Aggregate(集計) --[[合成>#]] ---[[Providerの合成>#l1234bc7]] ---[[値の合成>#lc85414b]] -Subscribeで、上記の其々のメソッドからの~ Push(=通知、発行、イベント)を受け取る[[Subscriber>Subscriber]]を設定する。 ***終了 [#cfa88dea] -ProviderがOnCompletedを呼び出し、正常終了。 -ProviderがOnErrorを呼び出し、異常終了。 -[[Subscriber>Subscriber]]側でDisposeする。 ***分類 [#v8621efa] 大きく分けて Hot / Cold に分類される。 -Cold --[[Subscriber>Subscriber]]とは1:1の関係 --[[Subscriber>Subscriber]]が居なければ動作しない。 --監視が終わった後はOnCompletedで(自分で)終了する。 --Observable.Intervalなど例外もある。 -Hot --[[Subscriber>Subscriber]]とは1:nの関係 --[[Subscriber>Subscriber]]がいなくても動作し続ける。 --監視が終わったかどうか[[Subscriber>Subscriber]]が判断してDispose。 **Subject (Subscriber/Provider) [#za803767] -IObserver<T>とIObservable<T>を実装したクラスを定義できる。 -Subjectを使用すれば、Subscriberを[[ラムダ式>ラムダ式って]]で定義できる。 *その他 [#h6fea2f5] **合成 [#vb3b8884] ***Providerの合成 [#l1234bc7] -Merge -SelectMany -Switch ***値の合成 [#lc85414b] -Concat -Zip -Amb -CombineLatest **変換 [#x898742f] ***イベント [#p74395c4] -FromEvent メソッドで、イベント・クラスを IObservable に変換できる。 -[[LINQ]]メソッドを使用し通知内容を操作できる。 --具体的には、ドラッグ操作を簡単に記述できる。 -参考 --Rx入門 (19) - マウス位置のトラッキング - xin9le.net~ http://blog.xin9le.net/entry/2012/02/13/233250 --マウスのドラッグ イベントを Rx で実装する | Do Design Space~ https://sakapon.wordpress.com/2016/10/28/reactive-drag/ --Reactive Extensionsを使ったWPFのドラッグアンドドロップをまとめる - Qiita~ https://qiita.com/ledsun/items/1ab669ecbea103972e7d ***非同期 [#g9d2a98d] -FromAsyncPatternメソッドでBeginInvoke/EndInvoke を IObservable に変換できる。 -[[LINQ]]メソッドを使用し通知内容を操作できる。 --具体的には、SelectMany を組み合わせ、非同期のネストを簡単に記述できる。 -参考 --Rx入門 (12) - 非同期処理のシーケンス化 - xin9le.net~ http://blog.xin9le.net/entry/2012/01/15/163827 --非同期でのリクエスト処理をRxでということの取り組みのメモ - かずきのBlog@hatena ---その1~ http://blog.okazuki.jp/entry/20120106/1325868975 ---その2~http://blog.okazuki.jp/entry/20120108/1326023608 **ポイント [#r843b36b] ***HotとColdの概念を掴む [#q22f19fe] ***Schedulerが実行スレッドを決定する [#r34c5e27] ***Subjectでテストする [#te77a44e] *参考 [#reabd08a] -Reactive Extensions~ https://msdn.microsoft.com/ja-jp/library/hh242985.aspx -Reactive-Extensions/Rx.NET: The Reactive Extensions for .NET~ https://github.com/Reactive-Extensions/Rx.NET **@IT [#r352575e] -Reactive Extensions(Rx)入門~ http://www.atmarkit.co.jp/fdotnet/introrx/index/index.html --第1回 Reactive Extensionsの概要と利用方法~ http://www.atmarkit.co.jp/fdotnet/introrx/introrx_01/introrx_01_01.html --第2回 イベント・プログラミングとRx~ http://www.atmarkit.co.jp/fdotnet/introrx/introrx_02/introrx_02_01.html **Build Insider [#p910777d] -各言語に広まったRx(Reactive Extensions、ReactiveX)の現状・これから~ https://www.buildinsider.net/column/kawai-yoshifumi/004 **Qiita [#z922823e] -いまさら聞けないReactive Extensions --.1~ http://qiita.com/Temarin/items/c2066394e91966c2d4ef --.2~ http://qiita.com/Temarin/items/456c3b40fa65954ea262 --.3~ http://qiita.com/Temarin/items/107fa2e39f427e591dbd --.4~ http://qiita.com/Temarin/items/be5f9cea260580327700 -こわくないReactive Extensions超入門~ https://qiita.com/acple@github/items/6cfee916f09632037a6e -C#とRxでリアクティブプログラミングしてみた。~ https://qiita.com/dotKomu/items/198d43d63eab08b2fafb **neue cc [#w7798530] -Reactive Extensions入門 + メソッド早見解説表~ http://neue.cc/2010/07/28_269.html --メソッド探訪 ---第1回 : FromEvent~ http://neue.cc/2009/09/04_197.html ---第2回 : AnonymousEnumerable~ http://neue.cc/2009/09/07_198.html ---第3回 : Subscribe~ http://neue.cc/2009/09/13_200.html ---第4回 : メソッド一覧~ http://neue.cc/2009/09/14_201.html ---第5回 : Scan~ http://neue.cc/2009/09/28_205.html ---第6回 : exception handling~ http://neue.cc/2009/11/29_226.html ---第7回 : IEnumerable vs IObservable~ http://neue.cc/2010/06/24_263.html **xin9le.net [#i9da2e72] -Rx入門~ http://blog.xin9le.net/entry/rx-intro -Hokuriku.NET C# -Rx入門- 資料~ http://blog.xin9le.net/entry/2012/03/19/120921 **かずきのBlog@hatena [#wc99d0b8] -Reactive Extensions カテゴリーの記事一覧~ http://blog.okazuki.jp/archive/category/Reactive%20Extensions -Reactive Extensionsのはじめかた~ http://blog.okazuki.jp/entry/2015/03/23/203825 -Reactive Extensions入門「まとめ」~ http://blog.okazuki.jp/entry/20101002/1286011016 -Reactive Extensions再入門 --その46「 Reactive Extensions 入門 」~ http://blog.okazuki.jp/entry/20120305/1329923070 **present [#n3237d18] -Reactive Extensions 入門 --(1)~ http://tnakamura.hatenablog.com/entry/20110113/reactive_extensions_1 --(2)~ http://tnakamura.hatenablog.com/entry/20110121/reactive_extensions_2 --(3)~ http://tnakamura.hatenablog.com/entry/20110124/reactive_extensions_3 --(4)~ http://tnakamura.hatenablog.com/entry/20110126/reactive_extensions_4 --(5)~ http://tnakamura.hatenablog.com/entry/20110201/reactive_extensions_5 **Muhammad Rehan Saeed [#u1e62193] -Reactive Extensions (Rx) --Part 1 - Replacing C# Events~ http://rehansaeed.com/reactive-extensions-part1-replacing-events/ --Part 2 – Wrapping C# Events~ http://rehansaeed.com/reactive-extensions-part2-wrapping-events/ --Part 3 – Naming Conventions~ http://rehansaeed.com/reactive-extensions-part3-naming-conventions/ --Part 4 – Replacing Timers~ http://rehansaeed.com/reactive-extensions-part4-replacing-timers/ --Awaiting Observables~ http://rehansaeed.com/reactive-extensions-part5-awaiting-observables/ --Part 6 – Task ToObservable~ http://rehansaeed.com/reactive-extensions-part6-task-toobservable/ --Part 7 – Sample Events~ http://rehansaeed.com/reactive-extensions-part7-sample-events/ --Part 8 – Timeouts~ http://rehansaeed.com/reactive-extensions-rx-part-8-timeouts/ ---- Tags: [[:.NET開発]]