почему Winform BegineInvoke слишком медленный? - PullRequest
0 голосов
/ 05 сентября 2018

Почему 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 голосов
/ 05 сентября 2018

Я не уверен, что полностью понимаю вопрос. Если вы просто хотите изменить элемент управления из потока пользовательского интерфейса, вы можете попробовать что-то вроде этого с BackgroundWorker:

                Control.Invoke((MethodInvoker) delegate
                {
                      // Anything you want do.
                });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...