C# WinForm窗体关闭时,如何显示第三方控件退出进度条?
解决方案
核心思路是先拦截窗体的默认关闭流程,用独立的等待窗口展示状态,再在后台线程执行耗时的Exit操作,完成后再真正关闭主窗体。之前的方案失效是因为主窗体进入Closing状态后,UI线程被阻塞,无法处理控件更新消息,而后台执行Exit并配合独立等待窗口可以避开这个问题。
步骤1:创建等待窗口
新建一个Windows Form(命名为WaitForm),添加一个ProgressBar(设置Style为Marquee)和一个Label(文本设为“正在退出,请稍候...”),可以设置窗口为TopMost = true、FormBorderStyle = FormBorderStyle.None,让它更醒目且不被干扰。
步骤2:修改主窗体的FormClosing事件
在主窗体中添加以下代码,拦截关闭流程并异步处理耗时操作:
private bool _isClosingInProgress = false; private async void MainForm_FormClosing(object sender, FormClosingEventArgs e) { // 避免重复触发关闭逻辑 if (_isClosingInProgress) return; if (Thing != null && Thing.IsOpened) { // 阻止窗体默认关闭行为 e.Cancel = true; _isClosingInProgress = true; // 显示等待窗口并强制刷新,确保立即显示 using (var waitForm = new WaitForm()) { waitForm.Show(); waitForm.Refresh(); // 在后台线程执行耗时的Exit操作,不阻塞UI await Task.Run(() => { try { Thing.Exit(); } catch (Exception ex) { // 捕获并处理可能的异常,比如弹窗提示或日志记录 MessageBox.Show($"退出操作出错:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } }); } // 耗时操作完成后,主动关闭主窗体 _isClosingInProgress = false; this.Close(); } }
关键说明
- 拦截默认关闭:通过
e.Cancel = true阻止主窗体直接进入关闭状态,避免UI线程被锁死无法更新控件。 - 异步后台执行:用
Task.Run将Thing.Exit()放到后台线程,配合await让等待窗口保持响应,用户能看到状态提示。 - 强制刷新等待窗口:调用
waitForm.Refresh()确保窗口立即完成绘制,不会因为后续的后台操作延迟显示。
内容的提问来源于stack exchange,提问作者DerekJ
相关产品推荐
相关产品推荐

