未处理的“System.InvalidOperationException”类型的异常出现在 system.windows.forms.dll 中。
其他信息: 在该控件上执行的操作正被错误的线程调用。必须使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。多线程操做treeview!
急,帮帮忙,有什么办法!?

解决方案 »

  1.   

    在多线程中,窗体控件的元素不是线程安全的,除了窗体线程,其他线程不可以对控件进行操作,但是你可以通过delegate来调用控件的方法,比如说要往TreeView添加新的节点,你需要声明一个Nodes.Add的delegate:delegate void AddNodeHandler(TreeNode node);
    然后添加节点是:yourTreeView.Invoke(new AddNodeHandler(yourTreeView.Nodes.Add), new object[]{newNode});参数yourTreeView.Nodes.Add是要调用的方法。如果是添加到子节点,那么就是myNode.Nodes.Add。注: yourTreeView是你的TreeView对象, myNode是要添加节点的父节点。
      

  2.   

    多线程操作control,必须用异步委托
    ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconasynchronousdelegatesprogrammingsample.htm
      

  3.   

    不要在创建控件以外的线程操作控件,Net 2.0已经把这个作为异常了。可以使用Control的Invoke方法,将操作放到UI线程上。private void Form1_Load(object sender, System.EventArgs e)
    {
        System.Threading.Thread tNew = new System.Threading.Thread    (new     System.Threading.ThreadStart(this.Test));
        tNew.Start();
    }delegate void SetVisibleDelegate();private void SetVisible()
    {
       this.button1.Visible = true;
    }private void Test()
    {
       this.Invoke(new SetVisibleDelegate(SetVisible));
    }
      

  4.   

    看vs2005的MSDN可以了解跟清楚,这是MSDN链接ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxmclictl/html/138f38b6-1099-4fd5-910c-390b41cbad35.htm
      

  5.   

    看这篇文章会比较清楚,
    http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
      

  6.   

    2楼的,我按照你的方法做了,为什么提示我错误 “int System.Windows.Forms.TreeNodeCollection.Add(System.Windows.Forms.TreeNode)”的返回类型错误 呢??是不是我哪里写错了??        private void button3_Click(object sender, EventArgs e)
            {
                try
                {
                    UdpThread = new Thread(UdpReciveThread);
                    UdpThread.Start();            }
                catch (Exception y)
                {
                    MessageBox.Show(this, y.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }        delegate void AddNodeHandler(TreeNode node);     //线程
            void UdpReciveThread()
        {                   
              TreeNode tn_child = new TreeNode("111"); 
              treeView1.Invoke(new AddNodeHandler(treeView1.Nodes.Add), new object[] { tn_child }); 
         }