Como posso despachar um evento da PropertyChanged de uma assinatura para um IOBServable baseado em intervalo

StackOverflow https://stackoverflow.com/questions/2591627

Pergunta

Estou recebendo uma exceção 'não autorizada, exceção inválida de acesso cruzado' quando tento aumentar um evento da PropertyChanged de dentro de uma assinatura de uma coleção IOBServable criada através do observável.interval ().

Com meu conhecimento limitado de encadeamento, estou assumindo que o intervalo está acontecendo em algum outro tópico enquanto o evento quer acontecer no tópico da interface do usuário ??? Uma explicação do problema seria muito útil.

O código se parece um pouco com:

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

Alguma soluções?

Editar:

Este código está sendo executado a partir de um ViewModel e não um dependencyObject.

Foi útil?

Solução

Editar: Eu estava confundindo assinar com o Observeon. Eu atualizei minha resposta

Você pode resolver seu problema colocando seu intervalo no thread do despachante:

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

Como alternativa, você pode usar ObserveOnDispatcher Mas isso envolveria fios de salto, então eu recomendaria contra:

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

Outras dicas

Usar:-

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

Editar

Já que você precisa fazer isso do viewmodel, veja isso responda Por Jeff Wilcox e seu excelente blog sobre o assunto: Notificações de mudança de propriedade para aplicações de Silverlight multithread.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top