可视化控件的Invoke和BeginInvoke方法
当我们在线程函数中写代码直接访问UI控件的属性和调用它们的方法时,结果无一例外,都会得到Visual Studio给出的同样的报错信息。
引发上述异常的原因在于TextBox控件是由主线程创建的,不能直接从另一个线程访问。
在Windows应用程序中,绘制窗体和控件是由“UI线程”负责的,因此Windows不允许其它线程直接访问可视化控件。其原因是Windows无法控制其它线程将如何使用这些控件,而对控件某些属性的设置和方法调用有可能直接影响到控件的外观。这样想想就明白了:如果UI线程正在绘制按钮的同时,另一个线程要修改按钮上的文字,第三个线程又尝试着修改此按钮的背景色,事情会不会弄得一团糟?这个按钮能“画”好吗?
因此,在.NET中有这样一个基本编程原则:
不能跨线程直接访问窗体和控件,对它们的访问必须转由UI线程来负责处理。
在.NET Framework中,所有可视化的控件(包括窗体)都是从System.Windows.Forms.Control类派生出来的,考虑到跨线程访问控件的需要,Control类提供了相应的方法完成跨线程更新界面工作。
1.Invoke同步方法
Control.Invoke方法定义如下:
public object Invoke(Delegate method);
Invoke方法的参数是一个委托,代表在创建控件的线程中要执行的方法。
创建两个线程MyJob1与MyJob2,MyJob1线程每200ms计数一次,MyJob