У меня есть проект 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);
}
Если я делаю это в основном потоке, пользовательский интерфейс зависает. Если я делаю это в рабочем потоке и вызываю mainViewport.Children.Add(...)
, он говорит, что не может получить доступ к ресурсам, созданным в этом рабочем потоке. Помощь?!
Насколько я понимаю, я достиг точки, когда у меня есть два потока и ресурсы, принадлежащие каждому из них (mainViewport => UIThread & myModel => WorkerThread
). Ни один из потоков не может получить прямой доступ к другому ресурсу, но создание и использование myModel в UIThread приводит к его зависанию... Все, что я хочу сделать, это иметь достаточную отзывчивость пользовательского интерфейса, поэтому пользователь может свернуть программу, ожидая загрузки моделей. , ничего больше. Как я могу это сделать? Есть ли способ выполнить всю тяжелую работу ЦП в UIThread, чтобы не возникало конфликтов ресурсов и чтобы рабочий поток обрабатывал только пользовательский интерфейс в это время?
PS: я пробовал с классами Thread, BackgroundWorker
и Task<TResult>
. Результаты были схожими, если не сказать одинаковыми.
PPS: Полная версия будет загружать массивные модели, которые будут загружаться более 30-40 секунд...