在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事件中,可以正常运行,有没有人可以解释,谢谢大家了

解决方案 »

  1.   

    你查找一下invoke/invokerequire的用法
    除主线程以外的程序更新界面显示(主线程)时一般需要用到invoke
      

  2.   

    那你就通过Control.BeginInvoke异步执行相应的递归操作。参照:
    http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpovrAsynchronousProgrammingOverview.asp
      

  3.   

    控件只能够为主线程 所有 所以只能够 
    如下实现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了
      

  4.   

    呵呵 不好 意思 上面少加了 个 myThread1.Start();//you know it!
      

  5.   

    呵呵 不好 意思 上面少加了 个 myThread1.Start();//you know it!
      

  6.   

    To Alan810(飞花落叶)
    编译不能通过,报错是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)
    {…….}
      

  7.   

    在多线程里要更改UI线程控件得数据,要通过控件得invoke和begininvoke委托得方法来实现
      

  8.   

    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)
    {…….}
      

  9.   

    是我稍微有点没细心,谢谢Alan810(飞花落叶)