winform开发就会涉及到线程中控制UI控件的问题,通常情况下是不能在线程中操作UI控件的,如果在调试模式下就会出现“线程间操作无效: 从不是创建控件“%%”的线程访问它。”的错误。那么正确的方法是使用委托,委托主线程操作UI,其实对C#的委托我也还没入门。。。这一点Mac下面就简单多了,直接有调用主线程更新UI的方法。
好了,废话不多说,先说不传参数的方法,在线程中写上
this.Invoke(new MethodInvoker(UpdateUI));
private void UpdateUI()
{
button1.Enabled = false;
button2.Enabled = true;
richTextBox1.Text = "添加内容";
}
UpdateUI这个方法就能在主线程中运行,编译器就不会说不是创建控件的线程访问了。如果要传递参数给这个方法怎么办呢?比如我想写一个方法来更新richTextBox,每次通过我传递的参数更新它。那首先肯定是要写这个方法,代码如下:
private void UpdateRichTextBox(string text)
{
richTextBox1.Text = text;
}
由于最上面的MethodInvoker只能创建不带参数的委托方法,所以这儿需要自己声明一个委托
private delegate void UpdateRichTextBoxEventHandler(string text);
然后修改
this.Invoke(new MethodInvoker(UpdateUI));
为
this.Invoke(new UpdateRichTextBoxEventHandler(UpdateRichTextBox), new object[] { "监听启动\n" });
好了,到此如何在线程中操作控件就说完了,特别要提醒的是,如果不在调试模式下面运行,在线程中操作控件也不一定会出问题,但是线程多了,操作界面频繁了,程序就会报错死掉。所以还是把所有的和UI有关的操作都放到主线程中去吧。