「[[マイクロソフト系技術情報 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開発]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS