如何从订阅派发PropertyChanged事件到基于时间间隔的IObservable

问题描述:

当我尝试从创建的IObservable集合的订阅中引发PropertyChanged事件时,出现'UnauthorizedAccesExpection - 无效的跨线程访问'异常通过Observable.Interval()。如何从订阅派发PropertyChanged事件到基于时间间隔的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); 
      }); 

编辑

,因为你需要从视图模型做到这一点看到这个answer由杰夫·威尔考克斯和他的关于这个问题的优秀的博客:Property change notifications for multithreaded Silverlight applications

+0

这是从一个ViewModel而不是一个DependencyObject调用,所以我没有一个Dispatcher属性。 – 2010-04-07 10:51:12