最近用C#做了一个小程序,里面用到了线程。在运行期间,线程需要对可视化单元进行处理。按照已往使用方法,便在线程上直接添加,以更改该单元的值,如:richTextBox.Appendtext="...."。但结果程序提示异常:不是创建控件“richTextBox”的线程访问它。不知道如何处理。
后来查阅资料发现:在.NET中每个线程有它自己的进程空间,一个线程里的对象的地址作为另一个线程的地址是没有用的。因此,试图访问另一个进程空间里的对象会引起一个不能控制的异常,从而导致程序崩溃。
解决方法:
Methodinvoker委派的BeginInvoke方法,用于一个进程空间的线程里调用另一个进程里的方法。这些方法对于线程来说是安全的,在多线程的环境下也可以使用。
部分代码如下:
private void UpdateRichTextBox()
{
richTextBox1.AppendText("...");
}
private void button1_Click(object sender, EventArgs e)
{
thread = new Thread(new ThreadStart(recieve));
thread.Start();
}
private void recieve()
{
MethodInvoker mi = new MethodInvoker(this.UpdateRichTextBox);
this.BeginInvoke(mi);
}