我有一个多线程应用程序,我需要将另一个线程中的对象添加到树视图中。但我一直得到例外
正在从错误的线程调用正在对此控件执行的操作。使用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);
}
}
答案 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。