其他信息: 在该控件上执行的操作正被错误的线程调用。必须使用 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是要添加节点的父节点。
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
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));
}
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
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 });
}
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是要添加节点的父节点。
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
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));
}
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
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 });
}
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 });
}