跨线程访问可视化控件的基本方法

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值