Adicionando uma criança a Viewport3D forma assíncrona dá “Esta API foi acessado com argumentos do contexto errado.”
-
05-07-2019 - |
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?
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);
}