一个线程的问题,在线等
初次接触线程
private void button1_Click(object sender, EventArgs e)
{
TdFun();
}
private void TdFun()
{
Thread thread1 = new Thread(Fun1);
Thread thread2 = new Thread(Fun2);
thread1.Start();
//Thread.Sleep(5000);
thread2.Start();
}
private void Fun1()
{
textBox1.AppendText( "abc " + "\r\n ");
//MessageBox.Show( "fsad ");
}
private void Fun2()
{
textBox2.AppendText( "def " + "\r\n ");
//MessageBox.Show( "eeeeeeee ");
}
报如下错:
Cross-thread operation not valid: Control 'textBox1 ' accessed from a thread other than the thread it was created on.
------解决方案--------------------在VS05中,你不能在一个线程中访问另一个线程创建的的控件,如果你想访问,要使用MS所谓的对Windows窗体控件进行线程安全调用的方法(我菜,搞不懂这有什么安全不安全的)。你可以去下个中文的MSDN2005来看,在MSDN的地址是:ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxmclictl/html/138f38b6-1099-4fd5-910c-390b41cbad35.htm 写得很详细。
当然你可以不用安全调用的方法,只要别在VS05中调试就行了,我一直用的不安全调用的方法(就是你这种方法),一直没出过问题。
------解决方案--------------------这个是线程使用最常见的问题,错误原因是你在子线程里改变了主进程的资源,这是不允许的,因为textbox是主进程的资源。此时应该使用委托来通知主进程修改textbox的值
private void button1_Click(object sender, EventArgs e)
{
TdFun();
}
private void TdFun()
{
Thread thread1 = new Thread(Fun1);
//Thread thread2 = new Thread(Fun2);
thread1.Start();
//Thread.Sleep(5000);
//thread2.Start();
}
private void Fun1()
{
this.Invoke(new changetext(changetextinfo),new string[]{ "abc "});
}
delegate void changetext(string info);