«System.InvalidOperationException» произошло в System.Windows.Forms.dll в задаче - PullRequest
3 голосов
/ 01 марта 2012

Я создаю приложение Winform и хочу обновить TreeView, который представляет дерево каталогов. Этот метод занимает одну или две секунды, поэтому я хочу запустить его параллельно.

Сначала я использую Task.Factory.StartNew () с этим кодом, но я получил ошибку 'System.InvalidOperationException' occurred in System.Windows.Forms.dll in Task.

Task loadTreeViewTask = Task.Factory.StartNew(() =>
        {
            try {
                directoryTreeView.Nodes.Clear();
                ....
                PopulateTreeView(directory, directoryTreeView.Nodes[0]);
            }
            catch (Exception e) {
               //Log
               //Change try/catch to CancellationToken
            }
        });

Затем я увидел, что Windows работает с однопоточным пользовательским интерфейсом, и обнаружил, что мне нужно использовать InvokeRequired:

directoryTreeView.Invoke((MethodInvoker)(() =>
{
  try {
    directoryTreeView.Nodes.Clear();
    ....
    PopulateTreeView(directory, directoryTreeView.Nodes[0]);
  }
  catch (Exception e) {
   //Log
   //Change try/catch to CancellationToken
  }
}));

Есть лучший способ сделать это?

1 Ответ

2 голосов
/ 01 марта 2012

Первая часть вашего кода не будет работать, потому что вы пытаетесь обновить элемент управления, созданный в потоке пользовательского интерфейса, поэтому, да, вам нужно будет использовать метод Invoke. Нельзя обновить элементы управления пользовательского интерфейса, созданные в потоке пользовательского интерфейса из другого потока.

...