我有一个 WPF 项目 ( VS2010
, .NET4.0
),在其中创建了一个相当大的ModelVisual3D
对象(从自定义格式STL
文件、进程信息、创建网格等读取)这大约需要 3-4 秒。要创建和另外 2-3 秒。做一个mainViewport.Children.Add(ModelVisual3D)
。我在自定义类中完成所有这些并调用此方法:
class My3DModel
{
...
public MyModelVisual3D createModelVisual3D(MyTypes tType, int tNumber)
{
this.myModelVisual3D = new MyModelVisual3D(tType, tNumber);
for (int i = 0, j = 0; i < this.Triangles.Length; i++)
{
this.mesh.Positions.Add(this.Triangles[i].Vertex1);
this.mesh.Positions.Add(this.Triangles[i].Vertex2);
this.mesh.Positions.Add(this.Triangles[i].Vertex3);
this.mesh.Normals.Add(this.Triangles[i].Normal);
this.mesh.Normals.Add(this.Triangles[i].Normal);
this.mesh.Normals.Add(this.Triangles[i].Normal);
this.mesh.TriangleIndices.Add(j++);
this.mesh.TriangleIndices.Add(j++);
this.mesh.TriangleIndices.Add(j++);
}
this.model3DGroup.Children.Add(new GeometryModel3D(this.mesh, material));
this.myModelVisual3D.Content = this.model3DGroup;
return this.myModelVisual3D;
}
}
返回值也是我创建的自定义类:
class ToothModelVisual3D : ModelVisual3D
{
//VARIABLES
private MyTypes myType;
private int number;
//OPERATORS
public MyTypes MyType
{get { return myType; } set { myType = value; }}
public int Number
{get { return number; } set { number = value;}}
public ToothModelVisual3D() { }
public ToothModelVisual3D(MyTypes tType, int tNumber) { MyType = tType; Number = tNumber; }
}
我想做的就是在程序开始时执行以下操作:
{
My3DModel myModel;
myModel = new My3DModel();
myModel.readFileBytes("C:\\registered\\" + 1 + ".stl");
myModel.loadTriangles();
mainViewport.Children.Add(myModel.createModelVisual3D(MyTypes.Sometype, 1);
}
如果我在主线程上执行此操作,则 UI 会挂起。如果我在工作线程上执行此操作并调用mainViewport.Children.Add(...)
它,则表示它无法访问在该工作线程上创建的资源。帮助?!
据我了解,我已经达到了一个地步,即我有两个线程和属于它们每个的资源(mainViewport => UIThread & myModel => WorkerThread
)。两个线程都不能直接访问对方的资源,但是在 UIThread 上创建和使用 myModel 会使它挂起......我要做的就是从 UI 获得足够的响应能力,因此用户可以在等待程序加载模型时最小化程序,仅此而已。我怎样才能做到这一点?有没有办法在 UIThread 上完成所有 CPU 繁重的工作,因此不会出现资源冲突,并且有一个工作线程只处理那个时间的 UI?
PS:我已经尝试过使用 ThreadBackgroundWorker
和Task<TResult>
classes。如果不说同样的话,结果是相似的。
PPS:完整版将加载大量模型,加载时间超过 30-40 秒...