悬赏分:20 浏览:254 次
如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,
并提示消息:“从不是创建控件 control name 的线程访问它。”
下面是部分代码
private void Form2_Load(object sender, EventArgs e)
{
Form2.CheckForIllegalCrossThreadCalls = true;
Thread t = new Thread(test);
t.Start();
}
public void test()
{
//Bitmap b = new Bitmap(@"c:\aaa.bmp");
// this.pictureBox1.Image = b;
this.textBox1.Text = "sss";
}
在方法test中设置textBox1的Text属性会报出"线程间操作无效: 从不是创建控件“textBox1”的线程访问它。"的错误
而给pictureBox1的Image属性赋值却没有这样的错误,为什么??请高手指点一二.
|
原因:
C#不允许在一个线程中直接访问或操作另一线程中创建的控件 也就是不允许多个线程同时对一个对像进行修改. 解决方法: 用Delegate,按你上面写的代码应该改成: private void Form2_Load(object sender, EventArgs e) { Form2.CheckForIllegalCrossThreadCalls = true; Thread t = new Thread(test); t.Start(); } public void test() { //Bitmap b = new Bitmap(@"c:\aaa.bmp"); // this.pictureBox1.Image = b; // this.textBox1.Text = "sss"; SetText("sss"); } //------------- private delegate void SetTextHandler(string str); private void SetText(string str) { if (textBox1.InvokeRequired) { SetTextHandler handler = SetText; textBox1.Invoke(handler, new object[] {str}); } else { textBox1.Text = str; } } 标准WinForm的Handler是不允许跨线程访问的。 因此,如果你的操作没有直接或间接访问到Window的Handle,就不会触发这个异常。而TextBox的Text属性,其实是通过向TextBox的Window Send一个WM_SETTEXT消息实现的,自然要访问Window的Handle,所以触发了异常。 详情,参考我的博客:http://www.cnblogs.com/Cajon/archive/2007/03/21/Multi_Thread_Win_Form.html |
|
3个月前 BZZ : PictureBox 控件在另一个线程中操作属性为什么没有报这样的错误呢?? |