我发现了一个“UnauthorizedAccesExpection - 无效的跨线程访问”异常,当我尝试从订阅中提出一个PropertyChanged事件通过Observable.Interval()

创建的IObservable集合。

在我有限的知识穿线我假设间隔上一些其他的线程,而该事件要在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 
                }); 

其他提示

使用: -

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

修改

由于需要从视图模型做到这一点看到这个答案通过杰夫·威尔考克斯和他的课题优秀的博客:属性更改通知多线程的Silverlight应用程序

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top