C# 子窗口显示进度条-BackgroundWorker 实现 作者:马育民 • 2025-03-09 23:52 • 阅读:10016 需要掌握:[C# BackgroundWorker 执行耗时任务,并更新UI](https://www.malaoshi.top/show_1IX6DWIplUqj.html "C# BackgroundWorker 执行耗时任务,并更新UI") # 进度条子窗口 Form窗口,界面如下:  ### 创建窗口 [](https://www.malaoshi.top/upload/0/0/1GW1Fmb71YTk.png) [](https://www.malaoshi.top/upload/0/0/1GW1FmdCehTv.png) ### 修改属性 不显示标题栏: [](https://www.malaoshi.top/upload/0/0/1GW1Fmyf2Y44.png) 屏幕居中显示: [](https://www.malaoshi.top/upload/0/0/1GW1FmzAxeB8.png) 不显示在任务栏: [](https://www.malaoshi.top/upload/0/0/1GW1Fragam5D.png) ### 代码 ``` /// /// 初始化进度条 /// /// public void initProgressBar(int max) { progressBar.Visible = true; // 设置进度条最小值. progressBar.Minimum = 0; // 设置进度条最大值. progressBar.Maximum = max; // 设置进度条初始值 progressBar.Value = 1; // 设置每次增加的步长 progressBar.Step = 1; } /// /// 设置进度条的进度 /// /// public void setProgressBarValue(int i) { progressBar.Value = i; } /// /// 设置进度条最大值 /// /// public void setMax(int i) { // 设置进度条最大值. progressBar.Maximum = i; } ``` # 主窗口 ### 创建进度条子窗口对象 进度条窗口定义成成员变量,可直接实例化 **不要** 在 BackgroundWorker的 `DoWork()` 方法中实例化,否则报错 `从不是创建控件“progressBar”的线程访问它。 ` ``` ProgressForm progressForm = new ProgressForm(); ``` ### 添加 BackgroundWorker [](https://www.malaoshi.top/upload/0/0/1GW1Fn1NdjiN.png) ### 添加 DoWork 事件 [](https://www.malaoshi.top/upload/0/0/1GW1Fn92vG0d.png) 该事件中加上耗时的任务 ``` private void progressBgWorker_DoWork(object sender, DoWorkEventArgs e) { progressForm.initProgressBar(10); for (int flbIndex = 0; flbIndex < 10; flbIndex++) { progressBgWorker.ReportProgress(progress+1); } } ``` ### 添加 progressChanged 事件 [](https://www.malaoshi.top/upload/0/0/1GW1FnXjk8et.png) 该事件增加更新 UI 代码 ``` /// /// 更新UI /// /// /// private void progressBgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { // 设置进度条 this.progressForm.setProgressBarValue(e.ProgressPercentage); // 设置进度条窗口的标题 progressForm.Text = "正在合并 " + e.ProgressPercentage + "/" + fileLstBx.Items.Count; } ``` ### 添加 RunWorkerCompleted 事件 [](https://www.malaoshi.top/upload/0/0/1GW1FnZcGtY0.png) ``` // 完成时提示,并关闭窗口 private void progressBgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { MessageBox.Show("合并成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); progressForm.Close(); } ``` ### 启动 BackgroundWorker ``` progressBgWorker.RunWorkerAsync(); progressForm.ShowDialog(); ``` **注意:** 调用 `RunWorkerAsync()` 后,就显示进度条窗口 **不要** 在 BackgroundWorker 的 `DoWork()` 方法中显示进度条窗口,否则报错 `从不是创建控件“progressBar”的线程访问它。 ` 参考: https://www.cnblogs.com/JackFu/p/7838729.html 原文出处:https://malaoshi.top/show_1GWjKy9xJ0R.html