我有一个多线程应用程序,我需要从另一个线程添加对象到树视图。但我不断收到异常如何从另一个线程在treeview中添加对象
正在对此控件执行的操作是由错误的线程调用的。使用Control.Invoke或Control.BeginInvoke对正确的线程进行编组来执行此操作。
这里是我的代码
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);
}
}
这是一个标准消息,您不能修改由非UI线程的UI线程创建的元素。将BeginInvoke()与您的线程的mainform中的匿名委托或常用委托一起使用。我认为,lambda和linq甚至提供更好的方法。 – icbytes
我在委托的帮助下做的,但仍然收到一个异常public delegate void MyDelagate(TreeNode tree,string value); public MyDelagate TreeViewDelegate; TreeViewDelegate =委托(TreeNode树,字符串s) { tree.Nodes.Add(s); }; TreeViewDelegate.Invoke(tree,allFiles [i] .Name); – Ilia
恕我直言,你根本不需要使用'ThreadPool'。只需在UI线程中调用该方法即可。你的方法没有做任何重要的工作。 –