2010-04-07 3 views
3

생성 된 IObservable 컬렉션에 대한 구독 내에서 PropertyChanged 이벤트를 발생 시키려고하면 'UnauthorizedAccesExpection - 잘못된 크로스 스레드 액세스'예외가 발생합니다 Observable.Interval()을 통해.Interval 기반 IObservable에 대한 Subscription에서 PropertyChanged 이벤트를 전달하는 방법

제한된 스레딩 지식으로 이벤트가 UI 스레드에서 발생하려고하는 동안 다른 스레드에서 간격이 발생한다고 가정합니다. ??? 문제에 대한 설명은 매우 유용합니다.

코드는 거의 같습니다

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

모든 솔루션을?

편집 :이 코드는 DependencyObject에 아닌 뷰 모델에서 실행중인

.

답변

2

편집 : ObserveOn을 사용하여 SubscribeOn을 혼란스럽게합니다. 나는 내 대답 업데이트 한

당신은 발송자 스레드에 간격을 넣어 문제를 해결할 수

: 당신이 ObserveOnDispatcher을 사용할 수있을 수 있지만, 그래서 난 좋겠 스레드를 점프 포함하는 것 또는

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

그것을 추천 :

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 속성이 없습니다. –

관련 문제