在form_load事件中,我有一个建树的递归过程,比较耗时间,就用了多线程序,
程序如下:
private void Form1_Load(object sender, System.EventArgs e)
{ System.Threading.Thread myThread1 = new System.Threading.Thread(new System.Threading.ThreadStart(test));
myThread1.Start();
}private void test()
{
TreeNode node2 = tree.Nodes.Add("计算机");
olecon.Open();
treefull(node2);
olecon.Close();
}
private void treefull(TreeNode treeNode)
{//递归过程
}编译时程序停在TreeNode node2 = tree.Nodes.Add("计算机");报错为“在该控件上执行的操作正被错误的线程调用。必须使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。 “但是如果把
TreeNode node2 = tree.Nodes.Add("计算机");
olecon.Open();
treefull(node2);
olecon.Close();
放在LOAD事件中,可以正常运行,有没有人可以解释,谢谢大家了
程序如下:
private void Form1_Load(object sender, System.EventArgs e)
{ System.Threading.Thread myThread1 = new System.Threading.Thread(new System.Threading.ThreadStart(test));
myThread1.Start();
}private void test()
{
TreeNode node2 = tree.Nodes.Add("计算机");
olecon.Open();
treefull(node2);
olecon.Close();
}
private void treefull(TreeNode treeNode)
{//递归过程
}编译时程序停在TreeNode node2 = tree.Nodes.Add("计算机");报错为“在该控件上执行的操作正被错误的线程调用。必须使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。 “但是如果把
TreeNode node2 = tree.Nodes.Add("计算机");
olecon.Open();
treefull(node2);
olecon.Close();
放在LOAD事件中,可以正常运行,有没有人可以解释,谢谢大家了
除主线程以外的程序更新界面显示(主线程)时一般需要用到invoke
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpovrAsynchronousProgrammingOverview.asp
如下实现System.Threading.Thread myThread1 ;
delegate void AddNodeDelegate();myThread1 = new System.Threading.Thread(new System.Threading.ThreadStart(threadone));void threadone()
{
this.tree.Invoke(new AddNodeDelegate(test);
}
private void test()
{
TreeNode node2 = tree.Nodes.Add("计算机");
olecon.Open();
treefull(node2);
olecon.Close();
}
private void treefull(TreeNode treeNode)
{//递归过程
}
这样就OK了
编译不能通过,报错是Invoke()方法未获取“0”的参数
我的代码是:
System.Threading.Thread myThread1 ;
delegate void AddNodeDelegate();
。。private void Form1_Load(object sender, System.EventArgs e)
{myThread1 = new System.Threading.Thread(new System.Threading.ThreadStart(threadone));
myThread1.Start();
}
private void threadone()
{
this.tree.Invoke(new AddNodeDelegate(test));
this.tree.Invoke();
}
private void test()
{
TreeNode node2 = tree.Nodes.Add("计算机");
olecon.Open();
treefull(node2);
olecon.Close();
} private void treefull(TreeNode treeNode)
{…….}
delegate void AddNodeDelegate();
。。private void Form1_Load(object sender, System.EventArgs e)
{myThread1 = new System.Threading.Thread(new System.Threading.ThreadStart(threadone));
myThread1.Start();
}
private void threadone()
{
this.tree.Invoke(new AddNodeDelegate(test));
//this.tree.Invoke();//多了一个 注释掉
}
private void test()
{
TreeNode node2 = tree.Nodes.Add("计算机");
olecon.Open();
treefull(node2);
olecon.Close();
} private void treefull(TreeNode treeNode)
{…….}