0

当我尝试将 3D 内容异步添加到 Viewport3D 时,这会导致“使用来自错误上下文的参数访问此 API”。在 TargetInvocationException 中。

3D 内容是从 3D 扫描设备的数据生成的。为此所需的通信和计算在单独的线程中完成。首先,我尝试从该线程访问 viewport3D。我意识到这应该由 GUI 线程完成,所以现在我使用以下代码:

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

似乎名为“模型”的对象不在当前线程的上下文中。我怎样才能解决这个问题?有没有办法让模型进入 Dispatcher 的上下文?或者这种方式不是去这里的方式?

4

1 回答 1

2

当您从不同的线程生成/修改场景对象以添加到视口时,就会发生这种情况,然后实例化一个视口。有一个简单的解决方法。将更新 Viewport 对象的代码封装到一个函数中。插入以下代码段,您就完成了。

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); 
}
于 2010-12-09T00:43:06.660 回答