为什么Winform BegineInvoke太慢?

时间:2018-09-05 09:01:10

标签: c winforms

为什么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方法。但是经过的时间也很慢。

为什么异步和开始调用太慢?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解这个问题。如果您只是想通过UI线程修改控件,则可以使用BackgroundWorker尝试类似的操作:

                Control.Invoke((MethodInvoker) delegate
                {
                      // Anything you want do.
                });