任务中的System.Windows.Forms.dll中发生'System.InvalidOperationException'

时间:2012-03-01 19:29:48

标签: c# winforms task-parallel-library

我正在构建一个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
  }
}));

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您的代码的第一部分将无法工作,因为您正在尝试更新在UI线程上创建的控件,因此,是的,您需要使用Invoke方法。您无法更新从另一个线程在UI线程上创建的UI控件。