まず、最新のRxである2.1を使用しています。私の知る限り、Rxが2になったとき、多くのことが変わったので、最新の回答を受け取るのを本当に楽しみにしています。前もって感謝します。
ユーザーに提案のリストを提供するために、Rxの古典的なタスクを実装しています。TextBoxのテキスト(正確にはWPToolkitのAutoCompleteBox)を監視します。提案はネットワークから取得され、Throttle、DistinctUntilChangedなどのこれらの通常のRxグッズを使用したいと思います。
また、最近リリースされたWindows Phone 8用のポータブルHttpClientを使用しています。これは、タスクベースの非同期APIを提供するためです。
私が抱えている問題は、「AutoCompleteBox」の値を読み取る際のクロススレッドアクセスです。Text
コードは次のとおりです。
var http = new HttpClient();
var searchFunc = Observable.FromAsync<HttpResponseMessage>(() =>
http.GetAsync(FormatUrl(SEARCH_URL, "DE", new GeoCoordinate(51, 13), searchBox.Text /* <-- causes exception */, 10, "")));
var uithread = new SynchronizationContextScheduler(SynchronizationContext.Current);
var textChange = Observable.FromEventPattern<RoutedEventArgs>(searchBox, "TextChanged")
.Throttle(TimeSpan.FromMilliseconds(800))
.DistinctUntilChanged()
.SubscribeOn(uithread)
.SelectMany(searchFunc)
.Select(async (resp) => SearchResultsParser.ParseSearchResults(await resp.Content.ReadAsStreamAsync(), new GeoCoordinate(51, 13)))
.Select(async (results) => searchBox.ItemsSource = await results)
.ObserveOn(uithread)
.Subscribe();
が実行されると例外が発生しsearchFunc
ます。VSから、SubscribeOnを使用しているにもかかわらず、ワーカースレッドで実行されていることがわかります。
これはを使用した例SynchronizationContextScheduler
ですが、私も試してみましたがSubscribeOnDispatcher
、同じ結果になりました。私はこのようなObserveOn
もので、または多分に関して重要な何かを見逃しているようですObservable.FromAsync
。私の間違いを教えていただけませんか。