日期:2014-05-17  浏览次数:20756 次

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;
那么程序就不会捕获这个异常了。
但并不建议这样做,因为可能导致一些不可预期的错误。