在该控件上执行的操作正被错误的线程调用。必须使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。

时间:2022-06-20 19:46:38
未处理的“System.InvalidOperationException”类型的异常出现在 system.windows.forms.dll 中。
其他信息: 在该控件上执行的操作正被错误的线程调用。必须使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。

多线程操做treeview!
急,帮帮忙,有什么办法!?

7 个解决方案

#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


gz

#5


看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

#6


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

#7


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 }); 
     }

#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


gz

#5


看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

#6


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

#7


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 }); 
     }