4

首先,我使用的是最新的 Rx,即 2.1。据我了解,当 Rx 2 岁时,很多事情都发生了变化,所以我真的很期待收到最新的答案。提前致谢。

我正在为 Rx 实现一个经典任务:观察 TextBox 的文本(确切地说是来自 WPToolkit 的 AutoCompleteBox),以便向用户提供建议列表。建议是从网络上获取的,我想使用这些普通的 Rx 好东西,比如 Throttle、DistinctUntilChanged 等。

我还在使用最近发布的适用于 Windows Phone 8 的便携式 HttpClient,因为它提供了基于任务的异步 API,这很好。

我遇到的问题是读取Text“AutoCompleteBox”值时的跨线程访问。这是代码:

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。尽管我使用了 SubscribeOn,但我从 VS 中看到它在工作线程上执行。

这是使用的示例SynchronizationContextScheduler,但我也尝试过SubscribeOnDispatcher,结果相同。看起来我错过了一些重要的ObserveOn东西,或者可能是关于Observable.FromAsync. 你能指出我的错误吗?

4

1 回答 1

8

SubscribeOn几乎从来都不你想要的——你可能认为它的意思是“我的Subscribe方法运行的地方”,但它实际上意味着“到IDisposable(和处置)的实际接线运行的地方”——ObserveOn相当于“这是我想要我的实际Subscribe代码的地方”执行”

参考:Observable.SubscribeOn 和 Observable.ObserveOn

于 2013-03-01T19:44:18.213 回答