未知处理时间的进度条

时间:2011-06-15 11:25:07

标签: winforms progress-bar

我正在开发启动/停止/重启Windows服务的winform(c#)。我想放一个进度条直到动作完成。我是.net编程的新手。请帮助我实现这一目标。

3 个答案:

答案 0 :(得分:9)

当您不知道需要多长时间时,您无法显示有意义的进展。您无法知道,服务需要1到30秒才能启动。您所能做的只是向用户显示“我没死,正在处理它”指示器。 ProgressBar支持它,将Style属性设置为“Marquee”。

您还需要在工作线程中启动该服务,以避免您的UI冻结。最好用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");
        }
    }

答案 1 :(得分:1)

您必须将小部件中的开始/停止/重启进度分开,并在部件完成后设置进度条。
对于即时更新,您需要深入了解正在执行的方法以获得有关其状态的反馈。

答案 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.直到检测到超时(您需要找到合理的秒数等待服务进入所需状态)
  4. 这似乎是唯一的方法。