当我尝试以异步方式将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);
似乎名为“model”的对象不在当前线程的上下文中。我怎样才能解决这个问题?有没有办法让模型进入Dispatcher的上下文? 或者这样做的方式不是去这里的方式吗?
答案 0 :(得分:2)
当您生成/修改要添加到Viewport的场景对象时,会发生这种情况,从一个不同的线程然后实例化一个Viewport。有一个简单的工作。封装将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);
}