我正在嘗試創建一個顯示動畫3D模型的wpf應用程序。我有工作代碼在BuildWave中創建模型(我知道這是我以前使用過的)。但是,當我將代碼移動到wpf窗口類中的後臺工作器時,出現錯誤「調用線程無法訪問此對象,因爲不同的線程擁有它」。將GeometryModel3D添加到Model3DGroup
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");
}
這引發錯誤「不能使用屬於不同的線程比其父可凍結爲DependencyObject。」,並再次有一個涵蓋了類似的問題(Cannot use a DependencyObject that belongs to a different thread than its parent Freezable)後,其建議凍結我在BuildWave中完成的模型:
GeometryModel3D model = new GeometryModel3D(WaveMesh, new DiffuseMaterial(Brushes.YellowGreen));
model.Transform = new Transform3DGroup();
model.Freeze();
return model;
我應該怎麼做才能解決這個問題?
謝謝你提前。
感謝。我對代碼的順序感到困惑,以及哪些線程可以完成哪些操作..現在排序! –