雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

わんくま東京勉強会 #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 での一通りの操作用の拡張メソッドが用意されているので是非お試しください。