4

まず、最新の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。私の間違いを教えていただけませんか。

4

1 に答える 1

8

SubscribeOn「私のメソッドが実行される場所」を意味すると思われるかもしれませんが実際には「 (および廃棄)Subscribeへの実際の配線が実行される場所」を意味します- 「これは私の実際のコードが必要な場所です」と同等です実行する」IDisposableObserveOnSubscribe

参照:Observable.SubscribeOnおよびObservable.ObserveOn

于 2013-03-01T19:44:18.213 に答える