windows-phone-8 – Rx 2.1:如何在Dispatcher上正确订阅和观察
首先,我使用最新的Rx,即2.1.据我所知,当Rx变为2时,很多事情都发生了变化,所以我真的很期待收到最新的答案.提前致谢.
我正在为Rx实现一个经典任务:观察TextBox的文本(确切地说是来自WPToolkit的AutoCompleteBox),以便向用户提供建议列表.建议来自网络,我想使用这些普通的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(),13))) .Select(async (results) => searchBox.ItemsSource = await results) .ObserveOn(uithread) .Subscribe(); 执行searchFunc时会发生异常.我从VS看到它在Worker Thread上执行,尽管我使用了SubscribeOn. 这是使用SynchronizationContextScheduler的示例,但我也尝试了SubscribeOnDispatcher,结果相同.看起来我遗漏了一些重要的东西,或者Observable.FromAsync.你能不能指出我的错误? 解决方法
SubscribeOn几乎不是你想要的 – 你可能认为它意味着“我的订阅方法运行的地方”,但它实际上意味着“IDisposable(和处理)的实际连线运行” – ObserveOn相当于“这就是我的地方”希望我的实际订阅代码执行“
参考:Observable.SubscribeOn and Observable.ObserveOn (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何在window.onscroll事件期间只调用一次javascript函数?
- windows-server-2003 – 在潜在的恶意网络上保护Active Dir
- 使用MergedDictionaries(UWP)拆分generic.xaml文件的正确语
- 什么是Windows最好的免费脚本化SFTP客户端?
- windows-server-2008 – 如何启用命令行远程访问Windows Se
- Windows 服务器操作系统安全设置加固方法
- Windows Phone 7 – WP7列表框滚动不工作
- exchange-2003 – microsoft exchange 2003和iPad2
- 环境变量和Path环境变量
- 如何在Windows上使用JPL(双向Java / Prolog接口)?