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

如何用C#实现重启SQL Server服务时加载进度条

给SQL Server服务重启添加进度条的实现方案

你的原始代码是同步执行的,会直接阻塞UI线程,导致进度条无法实时更新。下面是基于异步操作的改造方案,既能完成服务重启,又能正常显示进度提示。

前提准备

  1. 确保你的WinForms项目已添加System.ServiceProcess引用(右键项目→添加→引用→找到并勾选System.ServiceProcess)
  2. 窗体上添加一个ProgressBar控件(命名为progressBar1)和重启按钮(btnRestart)

实现代码(滚动式进度条,适合不确定进度的场景)

using System.ServiceProcess;
using System.Threading.Tasks;

// 按钮点击事件改为异步方法
private async void btnRestart_Click(object sender, EventArgs e)
{
    // 禁用按钮防止重复触发
    btnRestart.Enabled = false;
    // 配置进度条为滚动样式
    progressBar1.Style = ProgressBarStyle.Marquee;
    progressBar1.MarqueeAnimationSpeed = 30;
    progressBar1.Visible = true;

    try
    {
        using (var sv = new ServiceController("MSSQLSERVER"))
        {
            // 停止服务(如果当前未停止)
            if (sv.Status != ServiceControllerStatus.Stopped)
            {
                sv.Stop();
                // 异步等待服务停止,不阻塞UI
                await Task.Run(() => sv.WaitForStatus(ServiceControllerStatus.Stopped));
            }

            // 启动服务(如果当前未运行)
            if (sv.Status != ServiceControllerStatus.Running)
            {
                sv.Start();
                // 异步等待服务启动完成
                await Task.Run(() => sv.WaitForStatus(ServiceControllerStatus.Running));
            }
        }
        MessageBox.Show("SQL Server服务已重启完成!");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"重启失败:{ex.Message}");
    }
    finally
    {
        // 恢复UI状态
        btnRestart.Enabled = true;
        progressBar1.Visible = false;
        progressBar1.Style = ProgressBarStyle.Blocks;
    }
}

可选:分段式进度条(按停止/启动阶段更新)

如果想更明确地展示进度阶段,可以把进度条改为分段样式,按步骤更新进度值:

private async void btnRestart_Click(object sender, EventArgs e)
{
    btnRestart.Enabled = false;
    progressBar1.Style = ProgressBarStyle.Blocks;
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 100;
    progressBar1.Value = 0;
    progressBar1.Visible = true;

    try
    {
        using (var sv = new ServiceController("MSSQLSERVER"))
        {
            if (sv.Status != ServiceControllerStatus.Stopped)
            {
                sv.Stop();
                await Task.Run(() => sv.WaitForStatus(ServiceControllerStatus.Stopped));
                progressBar1.Value = 33; // 停止完成,更新进度到33%
            }

            progressBar1.Value = 66; // 准备启动服务,更新进度到66%
            if (sv.Status != ServiceControllerStatus.Running)
            {
                sv.Start();
                await Task.Run(() => sv.WaitForStatus(ServiceControllerStatus.Running));
                progressBar1.Value = 100; // 启动完成,进度到100%
            }
        }
        MessageBox.Show("SQL Server服务已重启完成!");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"重启失败:{ex.Message}");
    }
    finally
    {
        btnRestart.Enabled = true;
        progressBar1.Visible = false;
        progressBar1.Value = 0;
    }
}

关键注意事项

  • 必须以管理员权限运行程序,否则会因权限不足无法操作SQL Server服务
  • 使用using语句确保ServiceController资源被正确释放
  • async/await配合Task.Run实现异步操作,避免UI线程被阻塞
  • 异常捕获处理了服务不存在、权限不足、服务依赖问题等常见报错场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:04:51