当前位置: 首页 > news >正文

CSharp UI更新及跨线程更新总结

在C# WinForms中,‌多线程中不能直接处理UI更新‌。这是WinForms的一个重要限制。

原因:

  • WinForms UI控件不是线程安全的
  • UI线程(主线程)拥有创建所有控件的消息泵
  • 其他线程直接访问UI控件会导致跨线程异常

解决方案:

  1. 使用Control.Invoke方法‌(同步调用)

// 在工作线程中更新UI

if (textBox1.InvokeRequired) {

textBox1.Invoke(new Action(() => {

textBox1.Text = "更新后的文本"; }));

}

else { textBox1.Text = "更新后的文本"; }

2.‌使用Control.BeginInvoke方法‌(异步调用)

// 异步更新UI,不阻塞工作线程

if (textBox1.InvokeRequired) {

textBox1.BeginInvoke(new Action(() =>

{ textBox1.Text = "异步更新文本"; progressBar1.Value = 50; }

));

}

3.‌使用BackgroundWorker组件‌(推荐)                                                                     BackgroundWorker worker = new BackgroundWorker();

worker.WorkerReportsProgress = true;

worker.DoWork += (s, e) => {

// 后台工作 for (int i = 0; i <= 100; i++)

{

   worker.ReportProgress(i);

    // 报告进度

     Thread.Sleep(50);

} };

worker.ProgressChanged += (s, e) => {

// 这里可以直接更新UI,BackgroundWorker自动处理线程同步

progressBar1.Value = e.ProgressPercentage;

label1.Text = $"进度: {e.ProgressPercentage}%";

  };

worker.RunWorkerAsync();

4. 使用async/await模式‌(现代方式)

private async void button1_Click(object sender, EventArgs e) {

// 在UI线程中启动异步操作 await Task.Run(() => {

// 后台工作

   for (int i = 0; i <= 100; i++) {

 // 通过Invoke回到UI线程更新

  this.Invoke(new Action(() => {

   progressBar1.Value = i;

  label1.Text = $"进度: {i}%"; }));

   Thread.Sleep(50); } });

}

最佳实践:

  • 使用BackgroundWorker处理简单的后台任务
  • 使用async/await处理复杂的异步操作
  • 避免在后台线程中直接操作UI控件
  • 使用InvokeRequired检查当前线程上下文

这些方法确保了UI更新的线程安全性,避免了应用程序崩溃或不稳定的情况

http://www.dtcms.com/a/545194.html

相关文章:

  • 两个域名同一个网站做优化淘宝优惠网站怎么做
  • 深入仓颉UI:事件处理的声明式哲学与高阶实践
  • Actix Web 入门与实战
  • 外贸soho建站云南省建设厅网站二建
  • 20251029在AIO-3576Q38开发板的Android14下使用iperf3测试WIFI模块AP6256的网速【87.8 Mbits/sec】
  • 怎么用dede建设网站网站建设开放的端口
  • 基本select语句
  • linux命令-系统信息与监控-2
  • 【Ubuntu】安装amd驱动及ROCM后,系统起不来的问题分析及解决方案
  • 外国网站后台设计iis网页提示网站建设中
  • 镇江网站建设多少钱北京seo网站优化公司
  • 【第一章】金融数据的获取——金融量化学习入门笔记
  • MoonBit Pearls Vol.13:使用 MoonBit 开发一个 HTTP 文件服务器
  • 网站建设如何描述htm网站制作
  • SAP PP模块中流程制造
  • 网站攻击企业做营销型网站
  • SpringBoot项目集成easy-es框架
  • MySQL | 对数据库及数据库表格进行操作(实例)
  • 安装 ElasticSearch、Logstash、Kibana、Kafka 和 Filebeat
  • 从数据采集到智能诊断:阿尔泰科技实时高精度远距离管道状态监测全流程
  • MLGO微算法科技 LOP算法:实现多用户无线传感系统中边缘协同AI推理的智能优化路径
  • 签约快讯 | 当换科技携手体验家,重构二手3C全旅程体验
  • 2017网站开发新技术网站排名方法
  • flash打开网站源码网站开发亿玛酷出名5
  • ic电子网站建设网络营销策划推广方案
  • 视觉SLAM十四讲2nd—学习笔记(二)20250817
  • ADXL345 SPI加速度传感器Linux驱动开发笔记
  • 【自适应PF例程】基于Sage Husa的自适应粒子滤波与经典PF对比,MATLAB编写,可直接运行。三维状态量,非线性的状态与观测。附代码下载链接
  • 阿里云市场网站建设多语言做网站
  • 广东省城乡建设厅网站网站建设要解决哪些方面的事项