为什么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方法。但是经过的时间也很慢。
为什么异步和开始调用太慢?我该如何解决这个问题?
答案 0 :(得分:0)
我不确定我是否完全理解这个问题。如果您只是想通过UI线程修改控件,则可以使用BackgroundWorker
尝试类似的操作:
Control.Invoke((MethodInvoker) delegate
{
// Anything you want do.
});