如何用C#实现重启SQL Server服务时加载进度条
给SQL Server服务重启添加进度条的实现方案
你的原始代码是同步执行的,会直接阻塞UI线程,导致进度条无法实时更新。下面是基于异步操作的改造方案,既能完成服务重启,又能正常显示进度提示。
前提准备
- 确保你的WinForms项目已添加
System.ServiceProcess引用(右键项目→添加→引用→找到并勾选System.ServiceProcess) - 窗体上添加一个
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
相关产品推荐
相关产品推荐

