L'aggiunta di un figlio a Viewport3D in modo asincrono fornisce "L'API è stata letta con argomenti dal contesto errato".

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

Domanda

Quando provo ad aggiungere contenuto 3D a un Viewport3D, in modo asincrono, questo si traduce in " Questa API è stata letta con argomenti dal contesto sbagliato. " in una TargetInvocationException.

Il contenuto 3D viene generato dai dati di un dispositivo di scansione 3D. I calcoli di comunicazione e necessari per quello sono fatti in un thread separato. Innanzitutto, ho provato ad accedere al viewport3D da quel thread. Ho capito che questo dovrebbe essere fatto dal thread della GUI, quindi ora uso questo codice:

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

Sembra che l'oggetto chiamato " modello " non è nel contesto del thread corrente. Come posso risolvere questo problema? C'è un modo per ottenere il modello nel contesto di Dispatcher? O questo modo di farlo non è solo il modo di andare qui?

È stato utile?

Soluzione

Ciò si verificherà quando si generano / modificano oggetti scena da aggiungere a Viewport, da un thread diverso da quello su cui è stata istanziata Viewport. C'è una semplice soluzione. Incapsula il codice che aggiorna gli oggetti Viewport in una funzione. Inserisci il seguente frammento e il gioco è fatto.

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); 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top