C#通过Thread实现跨线程访问控件
|
admin
2025年4月1日 22:28
本文热度 1600
|
通过Thread使用委托的方式实现按下按钮后,结果1和结果2中显示计算的结果值。此案例中,在Thread里面不能对控件直接操作,因为使用Thread后相当于新建了一个线程,不能直接去访问主线程里面的控件。否则会出现下图中的错误。此时需要通过委托的方式实现跨线程操作。
使用InvokeRequired属性判断要操作的控件线程是否与Thread声明的线程是同一个线程,如果不是同一个线程则使用Invoke方法对其进行操作,Invoke中使用委托的方式,Action:代表无返回值的方法,Func:代表有返回的方法。Invoke:
1)用于在创建控件的线程上执行方法,以确保线程安全地访问 UI 控件。
2)用于调用委托(方法)的方式来确保方法在控件所属的线程上执行。
3)当你在非 UI 线程(如后台线程)试图更新 UI 控件时,会抛出 InvalidOperationException,使用 Invoke 可以避免这种错误。
control.Invoke(delegate, parameters);
control:要被调用的控件。
delegate:要在控件所属线程上执行的委托方法。
parameters:传递给该方法的参数(可选),即当delegate是有参数的方法时,需要为其传递的参数。
如下:按下按钮后,通过Thread创建线程,在线程中调用Invoke方法,通过Action委托(有参和无参)实现更新主界面UI。
namespace _013_Thread跨线程访问控件{ public partial class Thread跨线程访问控件 : Form { public Thread跨线程访问控件() { InitializeComponent(); } string str = "456789"; private void btTask_Click(object sender, EventArgs e) { Thread thread1 = new Thread(() => { if (this.lbl1.InvokeRequired==true) { this.lbl1.Invoke(new Action(() => { lbl1.Text = "123456"; })); } if (this.lbl2.InvokeRequired == true) { this.lbl2.Invoke(new Action<string>((st) => { lbl2.Text = st; }),str); } }); thread1.IsBackground = true; thread1.Start(); } }}
阅读原文:原文链接
该文章在 2025/4/2 14:28:18 编辑过