2011-06-15 100 views
4

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

回答

7

当你不知道需要多长时间时,你不能显示有意义的进展。您无法知道,服务需要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"); 
     } 
    } 
+0

当我使用此代码,我得到 – Gokul 2011-06-15 12:45:56

+0

从工具箱BackgroundWorker组件到窗体“backgroundWorker1不会在当前的背景下存在”。在属性窗口中设置事件处理程序,闪电图标。 – 2011-06-15 12:52:22

+0

非常感谢回复,进程栏即将到来,但是两者都没有开始。我用编码 – Gokul 2011-06-15 13:01:54

1

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

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. 它调用ServiceController.WaitForStatus有1秒超时,看服务是否已经进入相应的状态
  3. 增加1进度条值,直到超时被检测去2.(你需要找几秒钟内合理数量的等待服务进入理想状态)

这似乎是唯一的办法。