修正履歴 2011/11/04 21:36 「Reactive Extensionsで提供されている機能」の「IObserver<T>生成へのショートカット 」の「ラムダ式からIObservable<T>を内部的に生成してくれる」を「ラムダ式からIObserver<T>を内部的に生成してくれる」に修正しました。
ということで、この一年の目標で書いた目標を実現すべく第一歩として、とりあえず書いてみようと思います。書いておけば誰か間違いを指摘してくれるだろうというヨコシマな動機で書いているので、読んでくれる人がもしいるなら一緒に勉強していきましょう!
はじめに
ここでは、Reactive Extensions(下記リンク)の著者自身の理解を深めるために著者自身のReactive Extensionsの理解している内容を記載します。
Dev Lab Reactive Extensions ホームページ
前提条件
ここでは、下記の環境を前提に説明を行います。
- Visual Studio 2010 SP1 Ultimate
- .NET Framework 4
- Reactive Extensions 1.0.10621
Visual Studioは、Visual C# 2010 SP1 Express Editionでも動作可能です。
Reactive Extensionsとは
Reactive Extensionsは、公式ページに下記のように説明があります。
The Reactive Extensions (Rx)... ...is a library to compose asynchronous and event-based programs using observable collections and LINQ-style query operators.
拙い英語力で和訳を行うと「Reactive Extensionsは、監視可能なコレクションとLINQスタイルのオペレーションを使用して非同期とイベントベースのプログラムを合成するライブラリです。」となります。
個人的な解釈としては、Reactive Extensionsとは何かしらの値を0回以上通知するもの(C#のeventや非同期処理やタイマーなどetc…)を統一的なプログラミングモデルで扱えるようにしたものです。そして、この統一的なプログラミングモデルを提供するための要となるインターフェースがSystem名前空間の下にあるIObservableとIObserverです。
Observerパターン
ObserverとObservableという名前からもわかる通り、このインターフェースはデザインパターンのObserverパターンのための機構を提供します。IObserver
- void OnNext(T value)メソッド
- IObservable
から発生した通知を受け取って処理を行います
- IObservable
- void OnError(Exception ex)メソッド
- IObservable
で発生した例外を受け取って処理を行います。
- IObservable
- void OnCompleted()メソッド
- IObservable
からの通知が終了した時の処理を行います。
- IObservable
対になるIObservable
- IDisposable Subscribe(IObserver
observer)メソッド - 引数で受け取ったObserverにイベントの通知を行うようにします。戻り値のIDisposableのDisposeメソッドを呼び出すと通知を取り消します。
Reactive Extensionsは、このObserverパターンを土台にして構築されたライブラリになります。
Reactive Extensionsで提供されている機能
Reactive Extensionsは、このIObservable
- IObservable
のファクトリメソッド - Reactive ExtensionsにはIObservable
を返すファクトリメソッドが多数用意されています。.NETの標準のイベントからIObservable を生成するメソッドや、非同期呼び出し、タイマー、シーケンス、特定のルールで生成される値の集合etc…さまざまなものが提供されています。
- Reactive ExtensionsにはIObservable
- IObservable
の拡張メソッド - IObservable
とIObserver だけではイベントの発行と購読の関係にしかなりません。Reactive Extensionsでは、ここにLINQスタイルの拡張メソッドを提供することでIObservable から発行された値をフィルタリングしたり、発行された値を元に別の処理を行ったり、発行された値の変換を行ったりすることが出来ます。
- IObservable
- IObserver
生成へのショートカット - IObserver
を実装しなくても、ラムダ式からIObserver を内部的に生成してくれるため実際にReactive Extensionsを使用するときにはIObserver インターフェースを実装するケースは、ほとんどありません。
- IObserver
- 柔軟なスレッドの切り替え機能
- IObservable
から発行された値に対する処理を何処のスレッドで実行するのか柔軟に切り替える機能が提供されています。このためバックグラウンドで時間のかかる処理を行い、UIスレッドに切り替えて画面の更新を行うといった処理が簡単に行えるようになります。
- IObservable
以上が、Reactive Extensionsで提供されている機能の全体像になります。次からは、Reactive Extensionsの基本となるIObservable