3

Observable.Interval() によって作成された IObservable コレクションへのサブスクリプション内から PropertyChanged イベントを発生させようとすると、「UnauthorizedAccesExpection - Invalid cross-thread access」例外が発生します。

私の限られたスレッドの知識では、イベントがUIスレッドで発生したいときに、間隔が他のスレッドで発生していると想定していますか??? 問題の説明は非常に役立ちます。

コードは次のようになります。

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

解決策はありますか?

編集:

このコードは、DependencyObject ではなく ViewModel から実行されています。

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 に答える