Pergunta

Em um aplicativo WPF eu tinha um fio BackgroundWorker criação de um objeto. Vamos chamar o objeto foo.

código de trabalho de fundo:

SomeClass foo = new SomeClass();
// Do some operation on foo

// Set some dependency property on the main class to foo
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
    (SendOrPostCallback)delegate { SetValue(FooProperty, foo); },
    foo);

Agora, quando as principais tentativas de classe para acesso FooProperty usando um getter, eu recebo um InvalidOperationException:. O segmento de chamada não podem acessar este objeto porque um segmento diferente é o dono

Se o segmento a criar o objeto for concluído, por que ele ainda possuir o objeto? Existe alguma maneira de contornar isso.?

Foi útil?

Solução

Um objeto que você cria em um determinado segmento é propriedade de esse segmento. É por isso que você está recebendo um InvalidOperationException. Se você gostaria de definir uma propriedade em uma discussão de fundo, eu recomendo ter o delegado retornar o valor desejado e chamando SetValue do seu segmento principal. (Segmento que criou o objeto).

Outras dicas

A grande maioria dos objetos no WPF tem afinidade de segmento. Que é, uma vez criado em um segmento particular, um objeto WPF, então, só funcionam quando utilizado a partir desse fio. Esta restrição é imposta (ao contrário WinForms) em praticamente todas as operações que você faz nesse objeto.

Você precisará alterar seu código para ter Foo criado no thread UI real para este cenário.

SomeClass Assumindo que é derivado de DispatcherObject, o segmento que criou ele é executado a bomba mensagem que é responsável pelo processamento de mensagens para o objeto foo. Portanto, se esse extremidades de rosca, em seguida, o objeto pode mensagens deixaram de processo, o que não é uma boa idéia.

Na maioria das situações, você deve usar o mesmo segmento interface do usuário para criar todos os seus objetos de interface do usuário (ou qualquer outra coisa que é derivado de DispatcherObject e verifique se ele funciona para a duração da sua aplicação. Em seguida, use o Dispatcher para enviar mensagens para ele de seus segmentos de trabalho.

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