今天在论坛上面看到一个lz的关于c#的问题,运行出现错误。上网搜了答案,又看看自己的积累,本质的原因是:c#的跨线程调用控件的问题。经过一番查找,同时根据自己的资料,现总结如下:
1、系统自带委托(不带参数的控件调用)
//MethodInvoker 类型是一个系统定义的委托,用于调用不带参数的方法。 private Thread thread; private void button1_Click(object sender, EventArgs e) { thread = new Thread(new ThreadStart(Runthread)); thread.Start(); } private void Runthread() { MethodInvoker me = new MethodInvoker(SetLabelText); BeginInvoke(me); } private void SetLabelText() { label1.Text = "调用窗体控件"; }
2、自定义委托调用
第一种情况:带参数
private Thread thread; private delegate void setLabelText(string str); private void button1_Click(object sender, EventArgs e) { thread = new Thread(new ThreadStart(Runthread)); thread.Start(); } private void Runthread() { string ss = "直接调用"; if (this.label1.InvokeRequired) { setLabelText sl = new setLabelText(SetLabel); this.Invoke(sl, new object[] { ss }); } else this.label1.Text = "调用"; } private void SetLabel(string s) { label1.Text = s; }
第二种情况:不带参数
View Code
Thread th1, th2; double x1, x2; public delegate void SetControl(); private void button1_Click(object sender, EventArgs e) { th1 = new Thread(new ThreadStart(fangfa1)); th2 = new Thread(new ThreadStart(fangfa2)); th1.Start(); th2.Start(); } private void fangfa1() { if (label1.InvokeRequired) { label1.BeginInvoke(new SetControl(fangfa1)); return; } for (int i = 0; i < 50; i++) { x1 = i * 2; label1.Text += x1.ToString(); } } private void fangfa2() { if (label2.InvokeRequired) { label2.BeginInvoke(new SetControl(fangfa2)); return; } for (int i = 0; i < 50; i++) { x2 = i + 2; label2.Text += x2.ToString(); } }
3、以上就是跨线程对控件的调用,以下是本人在日常中用到的一个方法,不知道是不是对本标题的进一步解释,但感觉很有用就和大家分享下。
大致意思是在其它class类中往Form1中richTexbox中添加内容,意思和本标题有所接近吧,废话少说,代码如下:
View Code
private delegate void setRichTexBox(string str); private void button1_Click(object sender, EventArgs e) { setText("richTextBox添加内容:"); //这里是在控件中直接向richTextBox1添加内容。如果你想在其他的类中向richTextBox1中添加内容,直接调用setText函数就可以了 } public void setText(string s) { if (this.richTextBox1.InvokeRequired) { setRichTexBox fc = new setRichTexBox(Set); this.Invoke(fc, new object[] { s }); } else this.richTextBox1.AppendText(s); } private void Set(string txt) { richTextBox1.AppendText(txt); }
在Form2中调用Form1中的函数:
View Code
//以下代码是在Form2中 public Form1 myForm1; public delegate void Addmsg(string txt); public void Msg(string txt) { myForm1.AddRevMsg(txt); //AddRevMsg(txt)是Form1中的函数 } public void Diaoyong(string str) { Addmsg myAddmsg = new Addmsg(Msg); myForm1.BeginInvoke(myAddmsg, new object[] { str }); }
第一次写博客,有错误和不足之处,还希望大家多多指教,谢谢阅读。