@iRumba

Почему другой поток блокирует главную форму?

Есть процедурка, заполняющая дерево. Допустим
private void FillingTree()
{
for (int i=0; i<1000;i++)
{
TreeViewItem NewItem=new TreeViewItem();
NewItem.Header=i.ToString();
TreeView1.Dispatcher.Invoke( () => 
{
TreeView1.Items.Add(NewItem);
});
for (int j=0;j<1000;j++)
{
TreeViewItem NewSubItem=new TreeViewItem();
NewSubItem.Header=i.ToString() + "_" + j.ToString();
TreeView1.Dispatcher.Invoke( () => 
{
NewItem.Items.Add(NewSubItem);
});
}
}
}

и есть процедура, которая создает новый поток и запускает процедуру заполнения дерева в нем.
private void FillTreeAsync()
{
Thread th = new Thread(new ThreadStart(FillingTree));
th.Start();
}


Заполнение дерева занимает определенное время и на это время блокируется как само дерево так и форма. Ну, не то что бы прям блокируется, но замирает и дергается. Почему так происходит и как это исправить?
  • Вопрос задан
  • 324 просмотра
Пригласить эксперта
Ответы на вопрос 1
Neuroware
@Neuroware
Программист в свободное от работы время
TreeView1.Dispatcher.Invoke вызывает блокировку, на время исполнения Items.Add, чтобы не морозить форму можно попробовать создать в памяти отдельный treeview и заполнять его без Dispatcher.Invoke, а в конце, когда работа завершится перенести в него ноды используя Dispatcher.Invoke.
Но в таком случае пока не будет завершена обработка treeview будет пустой
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы