Agregar un hijo a Viewport3D de forma asincrónica da "Se accedió a esta API con argumentos del contexto incorrecto".

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

Pregunta

Cuando intento agregar contenido 3D a un Viewport3D, de forma asíncrona, esto da como resultado que se acceda a esta API con argumentos del contexto incorrecto. " en una TargetInvocationException.

El contenido 3D se genera a partir de los datos de un dispositivo de escaneo 3D. La comunicación y los cálculos necesarios para eso se realizan en un hilo separado. Primero, intenté acceder al viewport3D desde ese hilo. Me di cuenta de que esto debería hacerse mediante el subproceso de la GUI, así que ahora 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 el objeto denominado " modelo " no está en el contexto del hilo actual. ¿Cómo puedo arreglar esto? ¿Hay alguna manera de llevar el modelo al contexto del Dispatcher? ¿O es esta forma de hacer esto simplemente no el camino a seguir aquí?

¿Fue útil?

Solución

Esto ocurrirá cada vez que genere / modifique objetos de escena para agregarlos a la ventana gráfica, desde un hilo diferente al que se creó una instancia de la ventana gráfica. Hay un trabajo simple alrededor. Encapsule el código que actualiza los objetos de Viewport en una función. Inserte el siguiente fragmento de código y listo.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top