windows phone 8 - Rx 2.1:如何在Dispatcher上正确订阅和观察



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

我正在为Rx实现一个经典任务:观察文本框(AutoCompleteBox从WPToolkit准确)的文本,以提供给用户的建议列表。建议是从网络中获取的,我想使用这些普通的Rx好东西,如Throttle, DistinctUntilChanged等

我也在使用最近发布的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中看到它在一个Worker线程上执行,尽管我使用了SubscribeOn。

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

SubscribeOn几乎永远不是你想要的-你可能认为它意味着"我的Subscribe方法运行的地方",但它实际上意味着"实际连接到IDisposable(和处置)运行的地方"- ObserveOn相当于"这是我想要我的实际Subscribe代码执行的地方"

裁判:可观察到的。SubscribeOn和Observable。ObserveOn

相关内容

  • 没有找到相关文章