Rx利用の俺々MVVMライブラリ(を、いつか作りたい、今はまだMVVM自体がヨクワカッテナイのですが)と一緒に、そのうちにでも。WP7で全く同じコードが動くって素敵。思ったとしたら、いえ、違います。面倒くさいのはWebRequestでプログレスやアップロード処理を作るのが面倒くさいだけです。上のコードがゲップでそうな感じであるとしたら、Rxが面倒なせいではなくて、WebRequestが面倒なせいなだけです。これRx抜きに同期で書いても面倒臭いです。それどころか、一層大変なことになっていました。Rxの上に乗っかっているからこそ、色々な演算子が使えて、コンパクトに書けたのではないかと思われます。Extensionsは提供できているのではないでしょうか。7を輸入して電波法違反、じゃなくて、ええと、まあ、b-mobile回線で使っているのですけど、死ぬほど遅い。b-mobile遅い。300kbpsと謳っていて、それも遅いわけだけど実測だと100kbpsで大変遅い。TwitterのXML引っ張ってくる程度であっても(モバイル回線は貧弱なのでXMLじゃなくてJSONがいいですねえ)、何%といった表示は欲しかったりなのです。それはやり過ぎだとしても、Twitpicなどにカメラ画像を上げる時などではもう必須と言ってもいいぐらい。WebRequest使うとプログレスはご覧のように面倒臭いので、どうしてもサポート出来なかったりなのですよね。WebClient使えよってのは正論なのですが、諸事情あったりでWebRequest使いたいって場合もあるでしょう(OAuthとかあるしね)。Extensionsに載せるならイベントベースになっているWebClientよりもWebRequestのほうが使いよいということもあり。そんなジレンマの日々も今日でサヨナラです。7でも、幸せな非同期生活を送りましょう。ところで今回のプログレスの話はasync/awaitやBackgroundWorkerと絡めてお話したかったのですが、長くなるので断念。これは次回に(いや、次々回かもしれませんが)必ず書きます!もう既に半分ぐらいサンプルコードとかも書いてはあるので、絶対に近いうちには。serverが下敷きになってます。serverで紹介されているコードは、最新のRxのリリースに含まれているSystem.Reactive.ClientProfileに収録されています。このPart2で紹介されているAsyncReadLines(非同期でのStreamから一行毎にString取り出し)は簡易的すぎて使い物になりません。2バイト圏無視してるし、1バイトであっても挙動は怪しい。サンプルレベルなら良いと思うし記事は素晴らしく参考になったのですが、本体に収録/配布はやめて欲しかったなあ、少しがっかり。AsyncReadLines自体は欲しいですねえ。今のところ一行毎に取り出すにはStreamReaderしかないのだけれど、非同期APIがないので。非同期読み込み可能なStreamReaderは、何故かSystem.DiagnosticsにAsyncStreamReaderとしてあったりするのですが、internalクラスなので外からでは使えません。いうわけで、非同期で一行毎読み込みをやるには、自前実装しか無いようで。私はゆとりゆるふわプログラマなので、バイトとかエンコーディングとかが絡むのはやりたくないなー。いうか絶対ミスするでする。欲しいと思ったのでReadLineAsyncとして実装しました。↑ソースコードにも反映させてあります。.NET版とWP7同梱版との互換性をもたせました。リソースの扱いを正確にしました。WPF/SL/WP7のためのRxとMVVMを繋ぐ拡張ライブラリの一部として、より機能向上させライブラリとしてまとめあげたものを公開しました。↑ソースコードをそのまま使うより、ReactivePropertyを参照するほうをお薦めします。7そういえば、WP7ですか?中々良いですよ、日本語さえまともならば。それを抜きにしても、正直なところ想像以上に自由の効かないガチガチ縛りなので、Androiderな方々は絶対気に入らないと思っています。初版なのでダメなところが目立つのはしょうがないし、徐々に改善される(といいなあ!)でしょう。良いところに目を向ければ、大変可能性を感じるOSに仕上がってると思います。ちなみにWP7の開発環境に望むのはJSONサポート何とかしる!ってことですかね。標準だとシリアライザしか入ってないんですよ、ふざけんな死ね。System.Json入れるかJsonReaderWriterFactory入れるかしろって話ですよ本当に。あとdynamicのサポートが入ってくれればDynamicJsonを対応させるんだけどなあ。今のところ実機にアプリケーションを転送できません。WP7は認証が必要なので(有料)。認証のための証明書の発行手続きはしたのですが、その発行を請け負っているGeoTrustという会社があまりにも仕事しないせいでうばばばば。しょうがないので、今やれることは基盤をがっつし固めることぐらいですはい。(09/0121:22)Rxの情報が少なく、いつも楽しみに拝見させて頂いています。WebRequest拡張メソッドですが、気になる部分があります。キャンセル対応を行った為か、存在しないURL等を指定した場合に例外が発生しますがこれが上位にまで通知されずプログラムが落ちます。(09/0122:55)こちらこそ、ありがとうございます。貴重な情報、大変助かります。こちらで試したところ、問題なく伝達されている気がします。非同期の待機のため問題なく伝達が来たようです。よければ、再現コードを頂けると嬉しいです。一つ可能性があるのは、例外発生はEndGetResponse(ar)の際に発生しますが、ここは非同期実行のためThreadPool上での発生となります。(09/0207:15)さっそくの返信ありがとうございます。こちらで記述したコードは拡張メソッドの例として書かれていたダウンロードとアップロードのURIやヘッダー等を書き換えただけになります。>一つ可能性があるのは、例外発生はEndGetResponse(ar)の際に発生しますが、>ここは非同期実行のためThreadPool上での発生となります。>そのため、これをUIスレッドにまで通達させるにはObserveOnが必要です>(Catchするつもりなら不必要)まさしく、この状態だと思います。ObserveOnを追加したところ、onErrorでCatchされました。RC(日本語)で行っていますが、あれから色々とやってみて分かった事を書かせて頂きます。WP7に付属しているMicrosoft.Phone.Reactive.dllではObserveOnを記述してもしなくても例外がキャッチできません。先程の書き込みのようにObserveOnを記述して例外がキャッチできたのは、NuGetよりインストールしたRx-Main(System.Reactive)の方でした。(09/0318:38)ありがとうございます。すみません、私の方でも試しましたが、問題ないように見えました。SynchronizationContext())と記述しましたか?ObserveOnの役割は指定したスレッドに値を渡すことですが、この場合UIスレッドに渡したく、WPF/SLではUIスレッドはDispatcherが担うので.ObserveOnDispatcher()と記述していただければ、こちらで試した限りでは問題なく動きました。私の推測が的外れであれば、またお願いします。TimeoutやキャンセルとしてDisposeした場合にSubscribeでこの状態を取得できないものでしょうか?伝達がキャンセルされたという形になるので、そのままでは伝えるのは難しいですね......。汚く感じますが、外部変数で状態管理して、Finallyで捉えるとか、でしょうか。即座にキャンセル上のサンプルはWP7のPhone.Reactiveで書きました。例外発生時でも伝達されること&処理を行えることが確認できると思います。(09/0418:33)何度も検証して頂いて申し訳ありません。SynchronizationContext())はもちろん記述致しました。今回書いて頂きましたサンプルでもURLをgoogle.co.jp/404にした所、やはり例外がキャッチできませんでした。環境の問題なのかな?とも思いますので、一度環境をクリーンにしてみようかと思います。(09/0419:58)いえいえ、大丈夫です。SynchronizationContext())はもちろん記述致しました。いや、むしろWP7ではそれはダメで、.ObserveOnDispatcher()にしましょう、ということですー。例外がキャッチできませんでした。細かい部分でコードにずれがあるかもしれませんので、もし良ければhttp://ideone.com/にフルでコードを載せていただくと、こちらでも再現できるかもしれません。日本語の一番新しいSDK(7.1ですか)とMicrosoft.Phone.Reactiveで試しています。(10/1919:02)すみません。私も同じ現象で悩んでおります。プロジェクト一式をアップしましたので、時間がありましたら試して頂けないでしょうか。(10/2000:21)プロジェクトありがとうございます。存在しないURLに送る(反応が帰ってこない)ものに対しては規程のタイムアウト(10秒か20秒か、そのぐらいでしょうか)の時間待機している感じですね。それだけ待てば、ちゃんと(?)エラーが伝達されてきているようには見えました。ような存在しないものだと、タイムアウトの間うんともかんとも、となるのではかと。WP7ではタイムアウトの時間の設定は不可能なようなので、規程のタイムアウトの時間だと長すぎる、という場合はRxのTimeoutメソッドを使って、代替としてのタイムアウト例外を出すことが可能かと思います。(01/0211:22)あけましておめでとうございます。お返事いただいていたのにもかかわらず遅くなってすみませんでした。以下のコードでやはり例外をキャッチできませんでした。WP7.1(RTW日本語)です。例外が発生してしまいました。(01/0416:45)たびたび済みません。以下のようなコードにしたら例外をキャッチすることが出来ました。