繁体   English   中英

异步地向Viewport3D添加一个子级将提供“使用错误上下文的参数访问此API的信息。”

[英]Adding a child to Viewport3D asynchronously gives “This API was accessed with arguments from the wrong context.”

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

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

似乎名为“模型”的对象不在当前线程的上下文中。 我怎样才能解决这个问题? 有没有一种方法可以使模型适应分派器的环境? 还是这种方式不是去这里的方式?

每当您生成/修改场景对象以从实例化一个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); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM