スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Reactive Extensions

C#にてイベントを制御する際に「Reactive Extensions」に興味を持ったので調べてみた


【まずはインストール方法】
プロジェクトを右クリック → NuGetパッケージの管理 から Reactive Extensionsを探してInstall


【イベントの扱い方】
Rxでイベントを扱うためにはIObservableオブジェクトの作成が必要
Observableクラスにstaticな生成関数が用意されている
調査してみると
FromEvent
FromEventPattern

の二種類がある

二つの関数を歴史的にみると名前が置き換わってたりしていて結構ややこしい
似たようなことをしてるけどFromEventPatternのほうがすっきり書けることが多い

マウスダウンイベントをIObservableオブジェクトへと変換する場合以下のようになる

Observable.FromEventPattern
var mouseDown = Observable.FromEventPattern(this, "MouseDown");

Observable.FromEvent
var mouseDown = Observable.FromEvent(
h => (s, e) => h(e),
h => this.MouseDown += h,
h => this.MouseDown -= h);



【ドラッグ中に座標表示&離したらCompletedと表示するサンプル】
var mouseDown = Observable.FromEventPattern(this, "MouseDown");
var mouseUp = Observable.FromEventPattern(this, "MouseUp");
Observable.FromEventPattern(this, "MouseMove")
.SkipUntil(mouseDown)
.TakeUntil(mouseUp)
.Finally(() => textBlock.Text = "Completed")
.Repeat()
.Select(e => e.EventArgs.GetPosition(null))//座標を送る
.Subscribe(p => textBlock.Text = string.Format("X: {0}, Y:{1}", p.X, p.Y));
SkipUntil = 引数のIObservableから値が発行されるまで通行禁止
TakeUntil = 引数のIObservableから値が発行されるまで通行許可
Finally = 一連の処理が終わったタイミングで実行される
Repeat = Until系の制御を復活させるために追加(Finallyの後ろじゃないとダメ)

圧倒的にシンプルに書ける・・・ラムダ式との相性も抜群ですな
Doメソッドで目的のタイミングに処理を追加できるので、画面外でもキャプチしていたい場合は以下のようになる
.SkipUntil(mouseDown.Do(_ => this.CaptureMouse()))
.TakeUntil(mouseUp.Do(_ => this.ReleaseMouseCapture()))


【時間制御まわり】
イベントを流す際に時間を制御するものも豊富に用意されている
例)
Delay = 遅れて流す(指定時間経過してから流す)
Throttle = 落ち着いたら流す(指定した時間内に値がなければ値を流す)
Buffer = まとめて流す(指定時間内は値を溜めて最後にまとめて流す)
Timeout = 観測時間にリミットを付ける(指定した時間内に値がなければエラーにする)


【ファイルの更新監視サンプル】
FileSystemWatcherは書き込み時に複数のChangeイベントが発生して制御が面倒
そんなときはRXで解決!
var watcher = new FileSystemWatcher("C:\\", "test.txt") { EnableRaisingEvents = true };
var changed = Observable.FromEventPattern(watcher, "Changed")
.Throttle(TimeSpan.FromSeconds(1))
.Subscribe(_ => hogehoge);
Throttlenにより書き込みが落ち着いた時点でイベントが発行される




Rxはちょっと資料が少ないけれどかなり強力なライブラリなので今後も要チェックかも
日本語資料が少ない中、こちらのサイトにはお世話になりました
感謝感謝

ねよっと。
スポンサーサイト
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。