10.11/26WebClientは楽ちんです。WebRequestはシンドイです。そのシンドさといったら、FromAsyncPatternでラップした程度じゃあまり意味がなかったりなわけです。いえ、単純なダウンロード程度ならいいのです。アップロードとか!プログレスとか!そんなのに対応しようとすると、やっぱどうしょうもなく面倒臭い。いえ、面倒くさいのも一度書いてしまえば済むわけなので、一通り使いそうなものを書いてみました。7環境では標準搭載のMicrosoft.Phone.Reactiveで確認取ってあります。ソースコード、の前に利用例のほうを。.Subscribe(Console.WriteLine);実に簡単に、「WebClientの同期のように」WebRequestで非同期が扱えます。WebClientと同じ感覚で扱える、というのを大事にするためにも、メソッド名は同じにしてあります(但しUpload系の戻り値はWebResponseとしました、それが最もRx的に制御しやすいと感じたので)。名前末尾にAsyncを付けていますが、この命名規則はAsyncCTPから。WebRequestでポストする方法のおさらい。GetResponseStreamでResponseStreamを取り出し、結果を読み込む。stream.BeginRead。ふつーに書いたら人間の扱えるネスト量ではありませんね!というわけで、streamへのWrite/Readは隠蔽し、単純にアップロードしたら長さ1のReactiveシーケンスが、ダウンロードしたら長さ1のReactiveシーケンスが戻ってくる。いう形で簡単に扱えるようにしました。非同期が難しいとか面倒くさいとか、過去の話でしたね!プログレス表示プログレス(進捗表示)は大事です。WebClientにもProgressChangedイベントがあるし、せっかく非同期でやってるのだからプログレスも扱いたい。いうわけで、それ関連のメソッドも作りました。Percentage:パーセント、の読み取り専用プロパティが入ってます。.Subscribe(Console.WriteLine);基本的には非プログレスと同じなのですが、長さ1ではなくて進捗状況に応じた分だけ値が流れてくるという違いがあります。書き込み時はUnit、読み込み時はbyte[]が来るので、それを一本にまとめる必要があります。いうわけで、若干の手間とクセがあるのですが、まあそれなりに平易に扱えるのではと思います。UploadProgressとDownloadProgressを連結する辺りには、Rxの合成のパワーが見えるのではないでしょうかどうでしょうか。パワーが見えるのはいいとして意味が伝わるかは微妙なところなので、以下図解。ResponseStreamに細切れにWriteし、進捗状況を垂れ流します。Writeなので戻り値はない。Unit(voidみたいなものだと思ってくだしあ)。SelectManyでWriteからReadへ。RxにおいてのSelectManyは、1対多とかフラットにするとかというよりも、イメージとしては「摩り替える」だと思っています。