C#里创建线程的方式是
Thread t = new Thread(new ThreadStart(this.DoSomething));
t.Start();
里面的DoSomething是主线程里的一个函数,在里面做自己需要的操作。
那我就建了一个winForm程序来试一下,画了一个Button1,一个TextBox1
原先代码是这样的
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(this.Change_Text));
t.Start();
}
private void Change_Text()
{
textBox1.Text = "线程已开";
}
}
跑出来,按了一下Button1就报异常了,内容是说不能跨线程访问控件,也就是说新开的线程里跑的函数不能修改主窗口的TextBox内容。
在网上找了一下解决方法,有人用的是代理,解决也比较简单,就声明一个代理,在新线程的操作函数里实例化一个匿名代理,在里面完成操作,需要修改的代码如下:
<span style="font-size:12px;color:#000000;">public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(this.Change_Text));
t.Start();
}
<span style="color:#ff0000;">private delegate void CrossThreadOperationControl();//跨线程访问空间代理
private void Change_Text()
{
CrossThreadOperationControl CTOC = delegate()//匿名代理
{
textBox1.Text = "线程已开";
};
textBox1.Invoke(CTOC);
}
</span>
}
</span>