ein Kind zu Viewport3D gibt asynchron „Diese API mit Argumenten aus dem falschen Kontext zugegriffen wurde.“ Hinzufügen

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

Frage

Wenn ich versuche, 3D-Inhalte zu einer Viewport3D hinzuzufügen, asynchron, führt dies in „Diese API mit Argumenten aus dem falschen Kontext zugegriffen wurde.“ in einem TargetInvocationException.

Die 3D-Inhalte aus den Daten eines 3D-Scan-Gerät erzeugt. Die Kommunikation und Berechnungen für die benötigt wird, in einem separaten Thread durchgeführt. Zuerst habe ich versucht, die Viewport3D von diesem Thread acces. Ich erkennen dies sollte von dem GUI-Thread ausgeführt werden, so dass jetzt verwende ich diesen Code ein:

        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);

Es scheint, dass das Objekt mit dem Namen „Modell“ ist nicht im Kontext des aktuellen Threads. Wie kann ich dieses Problem beheben? Gibt es eine Möglichkeit, das Modell auf den Kontext des Dispatcher zu bekommen? Oder ist diese Art und Weise, dies zu tun einfach nicht die Art und Weise geht es weiter?

War es hilfreich?

Lösung

Dies tritt auf, wann immer Sie erzeugen / Szene-Objekte ändern, um Ansichtsfenster hinzufügen möchten, von einem anderen Thread dann die ein Ansichtsfenster wurde instanziiert auf. Es gibt eine einfache Arbeit um. Kapseln den Code, der Ansichtsfenster Objekte in eine Funktion aktualisiert. Fügen Sie den folgenden Code-Schnipsel und Sie sind fertig.

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); 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top