WinRT上的Rx-UI线程上的调度



我目前刚刚开始使用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来获得CoreDispatcherSchedulerObserveOnDispatcher

从那里你可以做:

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(出于性能原因)

相关内容

  • 没有找到相关文章

最新更新