做我有一個WPF項目(VS2010
,.NET4.0
),其中我創建了一個相當大的ModelVisual3D
對象(從自定義格式STL
文件,進程信息讀取,創建網,等等)這大約需要3-4秒。被創造並且另外2-3秒。做一個mainViewport.Children.Add(ModelVisual3D)
。 我做的這一切都在一個自定義類,並調用這個方法:C#WPF 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:我已經試過主題,BackgroundWorker
& Task<TResult>
類。如果不這樣說,結果是相似的。
PPS:完整版將加載大量的模型將加載超過30-40秒......
順便說一句我找不到如何實現* async/await *。如果我把它寫在項目中VS說沒有這樣的事情。 – mandarin