Почему Winform BegineInvoke слишком медленный?
Вот код, который я делаю в виде дерева winform и добавляю узлы.
Я делаю это в основном потоке, который находится в конструкторе формы.
//Create many tree nodes
TreeNode first = new TreeNode("First");
for (int i = 0; i < 3; i++)
{
TreeNode secondChild = new TreeNode("Second" + i);
for (int j = 0; j < 100; ++j)
{
TreeNode thirdChild = new TreeNode("Third" + j);
for (int k = 0; k < 3000; ++k)
{
TreeNode fourthChild = new TreeNode("Fourth" + i);
thirdChild.Nodes.Add(fourthChild);
}
secondChild.Nodes.Add(thirdChild);
}
first.Nodes.Add(secondChild);
}
//Measure the time add nodes to treeview
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("Start");
treeView1.Nodes.Add(node2); //add to treeview
Console.WriteLine("End : " + watch.Elapsed.ToString());
Требуется менее 0,1 секунды. Это не медленно.
Но если я создаю новую тему и делаю то же самое в новой теме, то это занимает более 40 секунд.
Я использую BeginInvoke для добавления узлов в древовидную структуру вне основного потока.
if (treeView1.InvokeRequired == true)
treeView1.BeginInvoke(new Action(() =>
treeView1.Nodes.Add(first)));
Почему начальный вызов очень медленный?
И я также использовал асинхронный метод вместо этого.
public TreeNode GetTreeNode()
{
TreeNode rootTree = null;
rootTree = new TreeNode("First");
for (int i = 0; i < 3; i++)
{
TreeNode secondChild = new TreeNode("Second" + i);
for (int j = 0; j < 100; ++j)
{
TreeNode thirdChild = new TreeNode("Third" + j);
for (int k = 0; k < 3000; ++k)
{
TreeNode fourthChild = new TreeNode("Fourth" + i);
thirdChild.Nodes.Add(fourthChild);
}
secondChild.Nodes.Add(thirdChild);
}
rootTree.Nodes.Add(secondChild);
}
return rootTree;
}
public async void AddNodeToTreeView()
{
TreeNode node = null;
Task<TreeNode> task = Task<TreeNode>.Factory.StartNew(() => node = GetTreeNode());
await task;
Console.WriteLine("Start");
Stopwatch watch = new Stopwatch();
watch.Start();
treeView1.Nodes.Add(node);
Console.WriteLine("End : " + watch.Elapsed.ToString());
}
И я вызвал метод AddNodeToTreeView. Но прошедшее время тоже было медленным.
Почему асинхронный и начальный вызов слишком медленный? Как мне решить эту проблему?