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

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();
    }
}

关键说明

  1. 拦截默认关闭:通过e.Cancel = true阻止主窗体直接进入关闭状态,避免UI线程被锁死无法更新控件。
  2. 异步后台执行:用Task.Run将Thing.Exit()放到后台线程,配合await让等待窗口保持响应,用户能看到状态提示。
  3. 强制刷新等待窗口:调用waitForm.Refresh()确保窗口立即完成绘制,不会因为后续的后台操作延迟显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:15:55