c# - 如何将 PropertyChanged 事件从订阅发送到基于 Interval 的 IObservable

标签 c# silverlight multithreading system.reactive

当我尝试从对通过 Observable.Interval() 创建的 IObservable 集合的订阅中引发 PropertyChanged 事件时,我收到“UnauthorizedAccesExpection - 无效的跨线程访问”异常。

以我有限的线程知识,我假设间隔发生在其他线程上,而事件想发生在 UI 线程上???对问题的解释将非常有用。

代码看起来有点像:

var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
                .Subscribe(x =>
                {
                    Prop = x; // setting property raises a PropertyChanged event
                });

有什么解决办法吗?

编辑:

此代码是从 ViewModel 而不是 DependencyObject 执行的。

最佳答案

编辑:我混淆了 SubscribeOn 和 ObserveOn。我已经更新了我的答案

您可以通过将间隔放在调度程序线程上来解决您的问题:

var subscriber = Observable.Interval(TimeSpan.FromSeconds(1), Scheduler.Dispatcher) 
                .Subscribe(x => 
                { 
                    Prop = x; // setting property raises a PropertyChanged event 
                }); 

或者,您可以使用 ObserveOnDispatcher,但这会涉及跳转线程,所以我建议不要这样做:

var subscriber = Observable.Interval(TimeSpan.FromSeconds(1)) 
                .ObserveOnDispatcher()
                .Subscribe(x => 
                { 
                    Prop = x; // setting property raises a PropertyChanged event 
                }); 

关于c# - 如何将 PropertyChanged 事件从订阅发送到基于 Interval 的 IObservable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2591627/

相关文章:

c++ - std::forward_list::insert_after 线程安全

c# - 使用 Windows 窗体应用程序在何处存储临时文件

silverlight - xna 16bit 纹理看起来像 8bit

silverlight - Windows Phone 7 中的语音到文本

multithreading - Python 类管道流对象

.net - 突然过度使用内存

c# - TypeHandler<T> 似乎没有被调用

c# - 为什么在 OnNavigatedTo() 事件中设置焦点不设置焦点?

c# - 具有 Observable 的复杂流程

silverlight - 关于 Silverlight 的问题以及应用程序的加载方式