2010-04-07 45 views
3

當我嘗試從創建的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執行該代碼。

回答

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 
       }); 
1

用途: -

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