我正在构建一个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使用单线程UI,我发现我需要使用InvokeRequired:
directoryTreeView.Invoke((MethodInvoker)(() =>
{
try {
directoryTreeView.Nodes.Clear();
....
PopulateTreeView(directory, directoryTreeView.Nodes[0]);
}
catch (Exception e) {
//Log
//Change try/catch to CancellationToken
}
}));
有更好的方法吗?
答案 0 :(得分:2)
您的代码的第一部分将无法工作,因为您正在尝试更新在UI线程上创建的控件,因此,是的,您需要使用Invoke
方法。您无法更新从另一个线程在UI线程上创建的UI控件。