C# 子窗口显示进度条-BackgroundWorker 实现 作者:马育民 • 2025-03-09 23:52 • 阅读:10008 # 进度条子窗口 Form窗口,界面如下:  禁止调整大小、禁止最大化、禁止最小化  ### 代码 ``` /// /// 初始化进度条 /// /// 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; } ``` # 主窗口 ``` private void progressBgWorker_DoWork(object sender, DoWorkEventArgs e) { progressForm.initProgressBar(10); for (int flbIndex = 0; flbIndex < 10; flbIndex++) { progressBgWorker.ReportProgress(progress+1); } } ``` ``` /// /// 更新UI /// /// /// private void progressBgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { // 设置进度条 this.progressForm.setProgressBarValue(e.ProgressPercentage); // 设置进度条窗口的标题 progressForm.Text = "正在合并 " + e.ProgressPercentage + "/" + fileLstBx.Items.Count; } ``` ``` // 完成时提示,并关闭窗口 private void progressBgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { MessageBox.Show("合并成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); progressForm.Close(); } ``` ### 关键1 进度条窗口定义成成员变量,可直接实例化 **不要** 在 BackgroundWorker的 `DoWork()` 方法中实例化,否则报错 `从不是创建控件“progressBar”的线程访问它。 ` ``` ProgressForm progressForm = new ProgressForm(); ``` ### 关键2 调用 `RunWorkerAsync()` 后,就显示进度条窗口 **不要** 在 BackgroundWorker 的 `DoWork()` 方法中显示进度条窗口,否则报错 `从不是创建控件“progressBar”的线程访问它。 ` ``` progressBgWorker.RunWorkerAsync(); progressForm.StartPosition = FormStartPosition.CenterParent; progressForm.ShowDialog(); ``` 参考: https://www.cnblogs.com/JackFu/p/7838729.html 原文出处:https://malaoshi.top/show_1GWjKy9xJ0R.html