如何在另一个线程的treeview中添加对象

时间:2016-03-21 16:52:23

标签: c# multithreading winforms treeview

我有一个多线程应用程序,我需要将另一个线程中的对象添加到树视图中。但我一直得到例外

  

正在从错误的线程调用正在对此控件执行的操作。使用Control.Invoke或Control.BeginInvoke对正确的线程进行Marshal来执行此操作。

这是我的代码

ThreadPool.QueueUserWorkItem(new WaitCallback(GetFiles), entryPoint);

private void GetFiles(object entryPoint) 
{ 
      var localData = entryPoint as EntryPoint; 
      this.GetFiles(localData.DirectoryInfo, localData.TreeNode); 
      localData.ManualEvent.Set(); 
}

private void GetFiles(DirectoryInfo directory, TreeNode tree) 
{ 
    for (int i = 0; i < allFiles.GetLength(0); i++) 
    { 
        tree.Nodes.Add(allFiles[i].Name);
    }
}

2 个答案:

答案 0 :(得分:4)

我认为你需要这样做:

Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => GetFiles(directory, tree)));

答案 1 :(得分:2)

如错误所述,您需要在UI线程上执行UI相关操作。为此,您可以使用控件本身的BeginInvoke

private void GetFiles(DirectoryInfo directory, TreeNode tree) 
{ 
    if (TreeViewControl.InvokeRequired)
    {
        TreeViewControl.BeginInvoke((MethodInvoker)delegate
        {
            for (int i = 0; i < allFiles.GetLength(0); i++) 
            { 
                tree.Nodes.Add(allFiles[i].Name);
            }
        });
    }
}

您可以找到更多信息here