未知进程时间的进度条

7

我正在开发一个启动/停止/重启Windows服务的Winform(C#)应用程序。我想在操作完成之前放置一个进度条。我是.NET编程的新手。请帮助我实现这个功能。

3个回答

10

如果你不知道需要多长时间,就无法展示有意义的进度。服务启动可能需要1到30秒,你只能向用户展示一个“仍在工作中”的指示器。ProgressBar支持这一功能,只需将Style属性设置为“Marquee”即可。

你还需要在工作线程中启动服务,以避免界面冻结。最好使用BackgroundWorker来实现。可以仿照下面的代码:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        ServiceProgressBar.Style = ProgressBarStyle.Marquee;
        ServiceProgressBar.Visible = false;
    }

    private void StartButton_Click(object sender, EventArgs e) {
        this.StartButton.Enabled = false;
        this.ServiceProgressBar.Visible = true;
        this.backgroundWorker1.RunWorkerAsync("foo");
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
        var ctl = new ServiceController((string)e.Argument);
        ctl.Start();
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
        this.StartButton.Enabled = true;
        this.ServiceProgressBar.Visible = false;
        if (e.Error != null) {
            MessageBox.Show(e.Error.ToString(), "Could not start service");
        }
    }

将 BackgroundWorker 组件从工具箱拖放到您的窗体上。在属性窗口中设置事件处理程序,即闪电图标。 - Hans Passant
非常感谢您的回复,进程栏已经出现但是却没有开始。我已经在问题中编辑了代码。 - Arjun
谢谢Hans,它起作用了!我还没有点击事件处理程序。 - Arjun
但我不明白为什么代码中有“foo”。它是用来做什么的? - Arjun
这是您想要启动的服务的名称。我编写了代码示例,假设您想要将其用于多个服务。请通过标记已回答来关闭您的问题。在最有帮助的帖子旁边打上大勾。 - Hans Passant
显示剩余2条评论

1
你的意思是想启动/重新启动/停止多个服务,并希望进度条指示“你已经处理完要启动/重新启动/停止的服务列表的进度”吗?你可以尝试以下方法:
progressBar.Maximum = listOfServicesToStart.Count;
progressBar.Value = 0;

for (int i = 0; i < listOfServicesToStart.Count; i++)
{
    // Start service listOfServicesToStart[i]
    progressBar.Value = i;
    Application.DoEvents();
}

如果您计划可视化服务的启动过程:我想您可能无法很好地完成它。Windows中的服务管理器似乎执行以下操作:

  1. 尝试启动/重新启动/停止服务
  2. 使用1秒超时调用ServiceController.WaitForStatus以查看服务是否已进入相应状态
  3. 将进度条值增加1并转到2,直到检测到超时(您需要找到一个合理的等待服务进入所需状态的秒数)

这似乎是唯一的方法。


1
你必须将开始/停止/重新启动进度分成小部分,在部分完成后设置进度条。
为了进行即时更新,您需要进入执行的方法以获取有关其状态的反馈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接