next = new StreamReader(res.GetResponseStream()).ReadToEnd(); var req2 = WebRequest.Create(next); return Observable.FromAsyncPattern<WebResponse>(req2.BeginGetResponse, req2.EndGetResponse)() }) .ObserveOnDispatcher() .Subscribe( res => MessageBox.Show(new StreamReader(res.GetResponseStream()).ReadToEnd()), ex => MessageBox.Show(ex.Message)); APMをラップする 階層構造はフラット 例外は最後に統一的処理が可能 実行スレッドのコントロール
var nextUrl = await new WebClient().DownloadStringTaskAsync("http://localhost:8403/TestAPI.as var result = await new WebClient().DownloadStringTaskAsync(nextUrl); MessageBox.Show(result); } catch (Exception ex) { MessageBox.Show(ex.Message); } } asyncキーワードを足す awaitキーワードで継続 awaitキーワードで継続 同期構文と何も変わらない例外処理
Rx(IObservable<T>)もawaitさせることはできます ⚫ 現在は実験版リリース or ver.2 Betaのみ対応 Rx is awaitable var nextUrl = await WebRequest.Create("http://localhost:8403/TestAPI.ashx").DownloadStringAsObservabl var result await WebRequest.Create(nextUrl).DownloadStringAsObservable()
Task is Observable new WebClient().DownloadStringTaskAsync("url").ToObservable() .SelectMany(x => new WebClient().DownloadStringTaskAsync(x)) .Subscribe()