WinRT 上的 Rx - 在 UI 线程上分派

Rx on WinRT - dispatch on UI thread

我目前刚刚开始使用 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 获得了最新版本 (2.2.5) 的 Rx。我想知道此版本是否缺少 UI 调度程序功能?

不确定这是否对您有帮助 - 但如果您缓冲事件,则可以使用 Scheduler(并分派到 UI 线程):

var uiScheduler = new SynchronizationContextScheduler(SynchronizationContext.Current);
yourObservable.Buffer(SomeTimeSpan, uiScheduler).Subscribe(..)

顺便说一句 - 如果您决定缓冲您的可观察量 - 请确保您在不同的 Observables 中使用相同的 Scheduler(出于性能原因)

您应该可以通过包含 nuget 包 rx-windowstoreapps.

来获得 CoreDispatcherSchedulerObserveOnDispatcher

从那里你可以做:

service = Observable.FromAsync(fn)
                    .ObserveOnDispatcher()
                    .Subscribe(videoColl =>

如果您从 UI 线程调用 - 我建议您应该在此处创建旨在更新 UI 线程的 Observables。

如果你不能这样做,你将需要获取并保存对 Dispatcher 的引用并使用 .ObserveOn(dispatcher) 代替(其中 dispatcher 是引用,从 Dispatcher 属性 页面或 window 等