C#通过Thread实现跨线程访问控件
|
admin
2025年4月1日 22:28
本文热度 106
|
通过Thread使用委托的方式实现按下按钮后,结果1和结果2中显示计算的结果值。此案例中,在Thread里面不能对控件直接操作,因为使用Thread后相当于新建了一个线程,不能直接去访问主线程里面的控件。否则会出现下图中的错误。此时需要通过委托的方式实现跨线程操作。
使用InvokeRequired属性判断要操作的控件线程是否与Thread声明的线程是同一个线程,如果不是同一个线程则使用Invoke方法对其进行操作,Invoke中使用委托的方式,Action:代表无返回值的方法,Func:代表有返回的方法。Invoke:
1)用于在创建控件的线程上执行方法,以确保线程安全地访问 UI 控件。
2)用于调用委托(方法)的方式来确保方法在控件所属的线程上执行。
3)当你在非 UI 线程(如后台线程)试图更新 UI 控件时,会抛出 Inv
alidOperationException
,使用 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 编辑过