Я создаю приложение 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
}
}));
Есть лучший способ сделать это?