C# 跨线程访问控件
跨线程访问控件,主要用到控件的属性判断InvokeRequired
是否为true
,为true
则为其他线程创建。
using System;
using System.Windows.Forms;
using System.Threading;
namespace 跨线程控件访问
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
StartPosition = FormStartPosition.CenterParent;
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread1 = new Thread(() => {
if (lbl1.InvokeRequired) { //判断是否调动Invoke方法, 如果为 true 则是其他方法创建。
for (int i = 0; i <= 50; i++) {
//Invoke()方法的第一个参数是返回值为void的委托,第二个是给委托对应方法传递的参数
lbl1.Invoke(new Action<string>(s => lbl1.Text = i.ToString()), i.ToString());
Thread.Sleep(50);
}
}
});
thread1.IsBackground = true;
thread1.Start();
}
private void button2_Click(object sender, EventArgs e)
{
Thread thread2 = new Thread(() => {
if (lbl2.InvokeRequired) { //判断是否调动Invoke方法, 如果为 true 则是其他方法创建。
for (int i = 0; i <= 50; i++) {
//Invoke()方法的第一个参数是返回值为void的委托,第二个是给委托对应方法传递的参数
lbl1.Invoke(new Action<string>(s => lbl2.Text = i.ToString()), i.ToString());
Thread.Sleep(50);
}
}
});
thread2.IsBackground = true;
thread2.Start();
}
}
}
输出:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了