Adicionando uma criança a Viewport3D forma assíncrona dá “Esta API foi acessado com argumentos do contexto errado.”

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

Pergunta

Quando tento adicionar 3D conteúdo para um Viewport3D, de forma assíncrona, isto resulta em "Esta API foi acessado com argumentos do contexto errado." em um TargetInvocationException.

A-conteúdo 3D é gerado a partir dos dados de um dispositivo 3D-scanning. Os cálculos de comunicação e necessários para que são feitas em um segmento separado. Primeiro, tentei acesso a Viewport3D de esse segmento. Percebi que isso deve ser feito pela GUI-thread, então agora eu uso este código:

        ModelVisual3D model = new ModelVisual3D();
        model.Content = scanline;

        DispatcherOperation dispOp = this.viewport.Dispatcher.BeginInvoke(
            new AddModelDelegate(StartAddModel), model);
    }
    private void StartAddModel(ModelVisual3D model)
    {
        this.viewport.Children.Add(model); 
        //model is not in the context of this current thread. 
        //Throws exception: "This API was accessed with arguments from the wrong context."
    }

    private delegate void AddModelDelegate(ModelVisual3D model);

Parece que o objeto chamado "modelo" não está no contexto do segmento atual. Como posso consertar isso? Existe uma maneira de obter o modelo para o contexto do Dispatcher? Ou isso é maneira de fazer isso simplesmente não é o caminho a percorrer aqui?

Foi útil?

Solução

Isto irá ocorrer sempre que você gerar / modificar objetos de cena para adicionar à Viewport, a partir de um segmento diferente, em seguida, o Viewport foi instanciado por diante. Há uma volta simples trabalho. Encapsular o código que atualiza Viewport objetos em uma função. Insira o seguinte trecho e está feito.

private delegate void MyFunctionDelegate();
void MyFunction()
{
     if(!Application.Current.Dispatcher.CheckAccess())
     {
         Application.Current.Dispatcher.Invoke(new MyFunctionDelegate(MyFunction));
         return; // Important to leave the culprit thread
     }
     .
     .
     .
     this.Viewport3D.Children.Remove(model);
     MyModifyModel(model);
     this.Viewport3D.Children.Add(model); 
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top