【C#】跨线程更新进度条_UpdateProgress 方法解析

文章目录

UpdateProgress 方法解析

下边是实战项目中的一段代码,比较有代表性,对其进行解析

csharp 复制代码
private void UpdateProgress(int current, int total, string message)
{
    // ===== Cross-thread Safety =====
    if (this.InvokeRequired)//line:527
    {
        this.BeginInvoke(new Action(() => UpdateProgress(current, total, message)));
        return;
    }

    // ===== 设置进度条范围 =====
    progressBar.Maximum = Math.Max(total, 1);
    progressBar.Value = Math.Min(current, progressBar.Maximum);

    // ===== 计算百分比 =====
    int percent = total > 0 ? current * 100 / total : 0;

    // ===== 更新文字标签 =====
    lblProgress.Text = string.IsNullOrEmpty(message)
        ? $"{percent}%  {current}/{total}"
        : $"{message}  {percent}%  {current}/{total}";
}

逐段说明

行 作用 细节
527-531 UI 线程安全 WinForms 控件只能在创建它们的线程(UI 主线程)上操作。刷写逻辑运行在后台线程(Task.Run),所以 InvokeRequired 检查是否跨线程。若是,用 BeginInvoke 异步投递到 UI 线程重新执行,避免死锁和跨线程异常
532 设置进度条上限 Math.Max(total, 1) 防止 total 为 0 时进度条报错(ProgressBar 最大值不能为 0)
533 设置当前进度 Math.Min(current, total) 防止 current > total 越界
534 算百分比 total > 0 防除零
535-537 设置文字 有 message(如步骤名)时前置显示,否则仅显示百分比和计数

调用链

UpdateProgress 通过事件订阅触发,在 SetupEvents() 中注册:

csharp 复制代码
Utils.Common.OnProgress += UpdateProgress;

刷写引擎内部通过 Common.ShowProgress(current, total, message) 触发,实现解耦。帧率由 Common 内部节流控制,避免 UI 线程被高频轰炸。

相关推荐
何以解忧唯有撸码4 小时前
c# + YOLODotNet+OpenCVSharp 实现物品轨迹追踪
计算机视觉·c#·winform·yolov8·opencvsharp
阿松爱学习14 小时前
【Unity开发】局部区域截图功能实现
unity·c#
zhanghaha131415 小时前
C# 系列教程_1 基础语法篇(面向新手系统教程)
开发语言·c#
昂好的day16 小时前
固高运动控制卡实战(下):点位运动与直线/圆弧插补 API 详解
开发语言·c#
淡海水20 小时前
08-02-优化-LINQ与函数式编程的GC代价
unity·c#·.netcore·linq·gc
sali-tec21 小时前
C# 基于OpenCv的视觉工作流-章114-视觉与http通讯
图像处理·人工智能·opencv·计算机视觉·c#
波力海苔夹心脆67521 小时前
C# 委托与事件详解:委托声明、Action/Func、多播、event 与 EventHandler 入门教程
开发语言·c#·.net·上位机·委托·事件
He BianGu2 天前
【笔记】C# 中BindingFlags的详细作用
笔记·c#
?abc!2 天前
(贪心)621. 任务调度器
java·前端·c#
开开心心就好2 天前
电脑小说阅读器,支持朗读和自定义皮肤
服务器·开发语言·javascript·算法·pdf·c#·音视频