可视化控件的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

本文介绍了在C# WinForm应用中,如何处理跨线程访问可视化控件的问题。讲解了Control类提供的Invoke同步方法和BeginInvoke异步方法,以及如何通过回调函数传递参数,确保UI线程的安全更新。
最低0.47元/天 解锁文章
1万+





