3

当我尝试从对通过 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 执行的。

4

2 回答 2

2

编辑:我把 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 
                }); 
于 2010-04-07T11:02:40.957 回答
1

采用:-

var subscriber = Observable.Interval(TimeSpan.FromSeconds(1))
            .Subscribe(x =>
            {
                Dispatcher.BeginInvoke(() => Prop = x);
            });

编辑

由于您需要从 ViewModel 执行此操作,请参阅Jeff Wilcox 的回答和他关于该主题的优秀博客:多线程 Silverlight 应用程序的属性更改通知

于 2010-04-07T10:47:24.267 回答