C#多线程中关于Invok的疑惑?求解!
C# code
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(test);
th.Start();
}
private void test()
{
this.button1.Text = "线程中修改Button文字";
}
代码很简单,一个winform界面上有一个button按钮,点击按钮后用了一个线程去修改button的文字。
疑惑的是这里跨线程访问控件为什么不报错呢?
用Ctrl+F5运行或者直接的debug目录中点击exe运行都不报错。
但是如果在调试状态中运行的话就会说:“线程间操作无效: 从不是创建控件“button1”的线程访问它。”
当然用Invok的话就全都OK了。
如果是WPF程序的话无论怎么运行都会报错,在winform中为什么有这样的情况呢?
求高人讲解其中的原由!
------解决方案--------------------
因为From有个CheckForIllegalCrossThreadCalls属性,该值指示是否捕获对错误线程的调用异常。
如果不显示的设置这个属性,那么编译后该属性会自动设置成false。
但是调试的时候这个值会自动设置成true。
所以直接运行的时候不会检测跨线程异常,但是调试的时候就会检测。
其目的应该是有助于在调试的时候发现错误。
你可以直接在Form的初始化方法中设置:CheckForIllegalCrossThreadCalls=false;
那么程序就不会捕获这个异常了。
但并不建议这样做,因为可能导致一些不可预期的错误。