わんくま東京勉強会 #64 アフターフォロー (17) : 通信処理 - AsynchronousExtensions
昨日は非同期通信処理記述時の道具として Rx を紹介しましたが、 Rx を使っていても結局同じ様なコードを毎回書かなければならなくて結構な手間がかかります。
……で、似た様なコードなら共通化(ライブラリ化)すればいいじゃない、と云う事で、 MSMVP for C# の neue さんが Reactive Property と云う非常に有用なライブラリを公開してくださっています。
# Reactive Property 自体は別の目的で作成されているライブラリですが、非同期通信用の拡張メソッド集が同梱されているのでここで紹介します。 Reactive Property については別の機会で紹介出来ればと思います。
WebRequest 拡張メソッドの利用
昨日の例を AsynchronousExtensions で書き直してみます。
- AsynchronousExtensions なし(昨日のと同じコードです)
var req = WebRequest.Create("http://example.jp/foo"); var req2 = WebRequest.Create("http://example.jp/bar"); var req3 = WebRequest.Create("http://example.jp/baz"); Observable.Merge( Observable.FromAsyncPattern<WebResponse>(req.BeginGetResponse, req.EndGetResponse)(), Observable.FromAsyncPattern<WebResponse>(req2.BeginGetResponse, req2.EndGetResponse)(), Observable.FromAsyncPattern<WebResponse>(req3.BeginGetResponse, req3.EndGetResponse)()) .Select(res => new StreamReader(res.GetResponseStream()).ReadLine()) .ObserveOnDispatcher() .Subscribe(v => { // 結果を処理 });
- AsynchronousExtensions 利用
# Codeplex.Reactive.Asynchronous 名前空間への using を追加しておいてください
var req = WebRequest.Create("http://example.jp/foo"); var req2 = WebRequest.Create("http://example.jp/bar"); var req3 = WebRequest.Create("http://example.jp/baz"); Observable.Merge( req.DownloadStringAsync(), req2.DownloadStringAsync(), req3.DownloadStringAsync()) .ObserveOnDispatcher() .Subscribe(v => { // 結果を処理 });
FromAsyncPattern の定型記述がなくなってだいぶすっきり♪
DownloadString 以外にも WebRequest での一通りの操作用の拡張メソッドが用意されているので是非お試しください。