我目前刚刚开始使用Rx,到目前为止发现它非常有用。然而,当我从异步方法创建可观察对象并用结果更新UI时,我遇到了问题。我(毫不奇怪)收到RPC_E_WRONG_THREAD错误,代码如下:
IDisposable service = null;
service = Observable.FromAsync(fn).Subscribe(videoColl =>
{
foreach (var video in videoColl.Videos)
{
// _videos is an ObservableCollection bound to a GridView's ItemsSource property
_videos.Add(video.SmallImageUrl);
}
});
我看过一些类似的答案,他们建议使用ObserveOnDispatcher或CoreDispatcherScheduler,这两种方法似乎都不适用于我
我正在创建一个Windows 8.1 UAP应用程序,我通过Nuget获得了Rx的最新版本(2.2.5)。我想知道这个版本是否缺少UI分配器功能?
您应该能够通过包含nuget包rx-windowstoreapps
来获得CoreDispatcherScheduler
和ObserveOnDispatcher
。
从那里你可以做:
service = Observable.FromAsync(fn)
.ObserveOnDispatcher()
.Subscribe(videoColl =>
如果你是从UI线程调用的,我建议你应该在那里创建Observables来更新UI线程。
如果不能做到这一点,则需要获取并隐藏对Dispatcher的引用,然后使用.ObserveOn(dispatcher)
(其中dispatcher
是指引用,从页面或窗口等的Dispatcher
属性中获得)。
不确定这是否对您有帮助,但如果您缓冲事件,则可以使用Scheduler
(并调度到UI线程):
var uiScheduler = new SynchronizationContextScheduler(SynchronizationContext.Current);
yourObservable.Buffer(SomeTimeSpan, uiScheduler).Subscribe(..)
顺便说一句,如果您决定缓冲您的可观测值,请确保您在不同的Observables
上使用相同的Scheduler
(出于性能原因)