You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 点击运行宏的按钮时如何绑定进度条实现逐宏更新无需定时器

实现方案

核心思路是先动态统计本次勾选对应的待执行宏总数量作为进度条最大值,每完成一个宏就手动更新进度条值,完全不需要定时器,进度和实际执行进度完全匹配。
具体实现步骤:

  • 先遍历所有勾选的复选框,统计本次需要运行的宏总个数,将进度条的Maximum属性设为该总个数,Value初始化为0
  • 将原有同步执行逻辑改为异步执行,避免宏运行、线程休眠操作阻塞UI线程,导致进度条无法刷新
  • 每执行完成一个宏,就将进度条的Value属性加1,全部执行完成后进度条刚好走到最大值
调整后的代码示例
private async void createAllButton_Click(object sender, EventArgs e)
{
    // 第一步:统计本次待执行的宏总数量
    int totalTasks = 0;
    if (ReportscheckBox.Checked) totalTasks += 1;
    if (CNCcheckBox.Checked) totalTasks += 1;
    if (DrawingscheckBox.Checked) totalTasks += 3;
    if (GAcheckBox.Checked) totalTasks += 3;

    // 边界处理:没有勾选任何选项直接返回
    if (totalTasks == 0)
    {
        MessageBox.Show("请先勾选需要导出的选项");
        return;
    }

    // 初始化进度条
    progressBar1.Maximum = totalTasks;
    progressBar1.Value = 0;
    createAllButton.Enabled = false; // 执行过程中禁用按钮避免重复点击

    try
    {
        if (ReportscheckBox.Checked)
        {
            // 如果RunMacro是耗时同步方法,可改成 await Task.Run(() => Operation.RunMacro("ExportReports.cs")); 避免卡UI
            Operation.RunMacro("ExportReports.cs");
            progressBar1.Value += 1;
        }
        
        if (CNCcheckBox.Checked)
        {
            Operation.RunMacro("ExportNC.cs");
            progressBar1.Value += 1;
        }

        if (DrawingscheckBox.Checked)
        {
            Operation.RunMacro("ExportShaft2.cs");
            progressBar1.Value += 1;
            await Task.Delay(5000); // 用异步延迟替代Thread.Sleep,不阻塞UI

            Operation.RunMacro("ExportPlate.cs");
            progressBar1.Value += 1;
            await Task.Delay(5000);

            Operation.RunMacro("ExportAssembly.cs");
            progressBar1.Value += 1;
            await Task.Delay(5000);
        }

        if (GAcheckBox.Checked)
        {
            Operation.RunMacro("ExportPDF2.cs");
            progressBar1.Value += 1;
            await Task.Delay(1000);

            Operation.RunMacro("ExportIFC.cs");
            progressBar1.Value += 1;
            await Task.Delay(1000);

            Operation.RunMacro("ExportDWG.cs");
            progressBar1.Value += 1;
        }

        packageButton.Show();
    }
    finally
    {
        createAllButton.Enabled = true; // 执行完成后恢复按钮可用
        // 可选:执行完成后重置进度条
        // progressBar1.Value = 0;
    }
}
补充说明
  • 代码中的progressBar1请替换为你项目中实际使用的进度条控件名称
  • 如果你使用的是.NET Framework的WinForm/WPF,上述async/await语法均支持,await执行完成后会自动回到UI线程更新进度条,不需要额外处理跨线程调用
  • 如果Operation.RunMacro本身就是异步方法,直接加await调用即可,不需要包Task.Run
  • 执行过程中禁用按钮可以避免用户重复点击导致多任务冲突

内容的提问来源于stack exchange,提问作者jacko10101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:57:00