【发布时间】:2017-02-26 13:03:38
【问题描述】:
我正在尝试创建一个显示动画 3D 模型的 wpf 应用程序。我有在 BuildWave 中创建模型的工作代码(我知道这很有效,因为我以前使用过它)。但是,当我将代码移动到 wpf 窗口类中的后台工作程序时,我收到错误消息“调用线程无法访问此对象,因为不同的线程拥有它。”
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = BuildWave();
}
private void worker_Completed(object sender, RunWorkerCompletedEventArgs e)
{
GeometryModel3D model = (GeometryModel3D)e.Result;
mGeometry = model.Clone(); //mGeometry is a private member of the window
if (group.Children.Contains(mGeometry)) //error is on this line
{
group.Children.Remove(mGeometry); //group is a Model3DGroup added in xaml
}
group.Children.Add(mGeometry);
System.Diagnostics.Debug.WriteLine("Added geometry to group");
}
我已经搜索了这个问题的解决方案,并找到了一个包含相同错误 (The calling thread cannot access this object because a different thread owns it) 的帖子,该帖子建议使用 Dispatcher.Invoke()。但是,当我尝试这样做时:
private void worker_Completed(object sender, RunWorkerCompletedEventArgs e)
{
GeometryModel3D model = (GeometryModel3D)e.Result;
mGeometry = model.Clone();
group.Dispatcher.Invoke(() =>
{
if (group.Children.Contains(mGeometry))
{
group.Children.Remove(mGeometry);
}
group.Children.Add(mGeometry); //error is now thrown on this line
});
System.Diagnostics.Debug.WriteLine("Added geometry to group");
}
这会引发错误“不能使用属于与其父 Freezable 不同的线程的 DependencyObject。”,并且再次有一篇涉及类似问题的帖子 (Cannot use a DependencyObject that belongs to a different thread than its parent Freezable) 建议冻结我在其中完成的模型构建波:
GeometryModel3D model = new GeometryModel3D(WaveMesh, new DiffuseMaterial(Brushes.YellowGreen));
model.Transform = new Transform3DGroup();
model.Freeze();
return model;
我应该怎么做才能解决这个问题?
提前谢谢你。
【问题讨论】: