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
.
来获得 CoreDispatcherScheduler
和 ObserveOnDispatcher
从那里你可以做:
service = Observable.FromAsync(fn)
.ObserveOnDispatcher()
.Subscribe(videoColl =>
如果您从 UI 线程调用 - 我建议您应该在此处创建旨在更新 UI 线程的 Observables。
如果你不能这样做,你将需要获取并保存对 Dispatcher 的引用并使用 .ObserveOn(dispatcher)
代替(其中 dispatcher
是引用,从 Dispatcher
属性 页面或 window 等
我目前刚刚开始使用 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
.
CoreDispatcherScheduler
和 ObserveOnDispatcher
从那里你可以做:
service = Observable.FromAsync(fn)
.ObserveOnDispatcher()
.Subscribe(videoColl =>
如果您从 UI 线程调用 - 我建议您应该在此处创建旨在更新 UI 线程的 Observables。
如果你不能这样做,你将需要获取并保存对 Dispatcher 的引用并使用 .ObserveOn(dispatcher)
代替(其中 dispatcher
是引用,从 Dispatcher
属性 页面或 window 等