如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 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属性赋值却没有这样的错误,为什么??请高手指点一二.
并提示消息:“从不是创建控件 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属性赋值却没有这样的错误,为什么??请高手指点一二.
http://topic.csdn.net/u/20100503/13/0503b79e-8a17-4ea0-98c0-c7f886c77a8b.html?seed=1691679054&r=65144079#r_65144079
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace AccessControl
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
Thread newthread = new Thread(new ThreadStart(BackgroundProcess));
newthread.Start(); } /// <summary>
/// 定义一个代理
/// </summary>
private delegate void CrossThreadOperationControl(); private void BackgroundProcess()
{
// 将代理实例化为一个匿名代理
CrossThreadOperationControl CrossDelete = delegate()
{
int i = 1;
while (i<5)
{
// 向列表框增加一个项目
listBox1.Items.Add("Item " + i.ToString());
i++;
}
label1.Text = "我在新线程里访问这个lable!";
listBox1.Items.Add(label1.Text);
} ;
listBox1.Invoke(CrossDelete);
} }
}
//上面是一个类似的代码实现
CheckForIllegalCrossThreadCalls = false;
禁止:检查非法的跨线程调用
这个方法最简单,如果没有多个线程同时修改的话,就可以用这个了。
如果有多个线程修改一个控件,就不能这样了,必须做线程同步!
我问的是pictureBox为什么没有这种保护???
还有,我的结帖率确实惊人!!!
官方解释:
此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。难道窗体上的PictureBox1是静态的??
此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。你别告诉我我的Form上的Lable也是静态的.......
你把 this.pictureBox1.Refresh(); 这个语句试着放上去, 也会出现同样的异常.
PictureBox1.Image=objImage;
会没事呢?