Как отправить событие PropertyChanged из подписки в IObservable на основе интервала - PullRequest
3 голосов
/ 07 апреля 2010

Я получаю исключение 'UnauthorizedAccesExpection - Invalid cross-thread access', когда я пытаюсь вызвать событие PropertyChanged из подписки на коллекцию IObservable, созданную с помощью Observable.Interval ().

С моим ограниченным знанием потоков я предполагаю, что интервал происходит в каком-то другом потоке, в то время как событие хочет произойти в потоке пользовательского интерфейса ??? Объяснение проблемы было бы очень полезно.

Код выглядит примерно так:

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

Какие-нибудь решения?

Edit:

Этот код выполняется из ViewModel, а не DependencyObject.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2010

Редактировать: Я путал 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 голос
/ 07 апреля 2010

Использование: -

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

Редактировать

Поскольку вам нужно сделать это из ViewModel, посмотрите ответ Джеффа Уилкокса и его превосходного блога на эту тему: Уведомления об изменении свойств для многопоточных приложений Silverlight .

...