最近遇到子进程调用控件发生的异常的解决方法:
比如:子进程获取到的数据,并根据数据对Treeview 创建节点
//子进程方法
robot_GetPublicContactEvent()
则在子进程中创建节点 触发以下异常信息:在该控件上执行的操作正从错误的线程调用。使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。
错误原因:在多线程中,为了数据的安全,进(线)程是不能直接访问窗体控件的元素的。除了UI线程,其他线程不可以对控件进行操作
解决方法:采用Invoke 或者BeginInvoke();
本人用了Invoke ,附上代码:
//让委托去帮我创建Treeview节点
public delegate void CreateNodeDelegate();
//子进程方法
private void robot_GetPublicContactEvent()
{
if (this.InvokeRequired)
{
CreateNodeDelegate createNodeDelegate = new CreateNodeDelegate(CreateNode);
this.Invoke(createNodeDelegate);
}
}
private void CreateNode()
{
//添加节点 根据Root 获取公众号信息
//treeView
//所有人 公众号 联系人
TreeNode rootNode = new TreeNode("所有人");
treeView.Nodes.AddRange(new TreeNode[] { rootNode });
}