2011-06-15 105 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.(你需要找幾秒鐘內合理數量的等待服務進入理想狀態)

這似乎是唯一的辦法。