CheckForIllegalCrossThreadCalls = false
允许跨线程访,但是此不稳定,要慎用
设置一个如下的界面,点击“button1”,改变label的值,改变label值是通过建立一个线程启动线程执行方法实现改变的,当在button的click事件函数里不加CheckForIllegalCrossThreadCalls = false这句话的时候,默认不允许跨线程访问,用异常捕获会提示:
线程间操作无效:从不是创建控件label的线程去访问它。
创建控件label的线程是页面启动的主线程,而我改变label的值是通过自己创建的另一个线程去访问,即是跨线程操作,系统不允许这么做
当在button的click事件中,加入这句话的时候Form1.CheckForIllegalCrossThreadCalls = false;发现,label的值改变了,系统也允许跨线程访问label了
给出验证不稳定性的一个例子:
即使已经加了Form1.CheckForIllegalCrossThreadCalls = false这句话,但是当我在button的click事件下连续两次调用自己创建的线程的时候,问题出现了,系统不提示不允许跨线程访问了,但是我改变label值的时候,提示到以下错误 ;
即:通过CheckForIllegalCrossThreadCalls的值忽略跨线程错误,但是这个时候会监测到异常
综上:不建议过多的使用允许跨线程访问,以下的附加的代码,关于用invoke方法解决该问题,参考下一篇博文
// 通过CheckForIllegalCrossThreadCalls的值忽略跨线程错误,这时会抛出异常
private void button1_Click(object sender, EventArgs e)
{
Form1.CheckForIllegalCrossThreadCalls = false;//允许跨线程访问
//第一次调用
btn1 = new Thread(new ThreadStart(doThread));
btn1.IsBackground = true;
btn1.Start();
Thread.Sleep(50);
//第二次调用
// btn1 = new Thread(new ThreadStart(doThread));
// btn1.IsBackground = true;
// btn1.Start();
}
// 不使用invoke方法直接进入Control
void doThread()
{
for (int i = 0; i < 100; i++)
{
test();
Thread.Sleep(10);
}
}
// 模拟一个实际应用
// 对label1赋值后立马检查他的值,如果已经被改过则抛出异常
void test()
{
try
{
string strText = Guid.NewGuid().ToString();//随机生成一串字符
this.label1.Text = strText;//改变label.Text的值
if (this.label1.Text != strText)
{
MessageBox.Show("label1的值意外改变", "错误提示");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "跨线程访问错误提示");
}
}