首先,我使用的是最新的 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
. 你能指出我的错误吗?