2013-05-02 45 views
0

你好,我有一個需要時間加載的函數。這就是爲什麼我打算在我的winform上放置一個進度條,以便用戶知道我的程序仍在運行。然而,我不知道我會如何解決它。有沒有人可以幫助指導我。進度條c# - 類似進程的加載

這裏就是我打算做的事:

private void btnProcess_Click(object sender, EventArgs e) 
     { 
      //function which takes time because it contacts to a server 
     } 

我想有一個進度條,其增量和我的過程完成之後結束。我應該使用背景工作嗎?

***我按照這個教程http://www.codeproject.com/Tips/83317/BackgroundWorker-and-ProgressBar-demo,但它並沒有等待一個特定的功能或事件完成像加載屏幕。

***在我的buttonclick事件完成其所有功能後,我的進度條並未結束。

我創建:

private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      for (int i = 0; i <= 100; i++) 
      { 
       myBackgroundWorker.ReportProgress(i); 
       System.Threading.Thread.Sleep(100); 
      } 
     } 

private void myBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      myProgressBar.Value = e.ProgressPercentage; 
     } 

private void btnProcess_Click(object sender, EventArgs e) 
      { 
       myBackgroundWorker.RunWorkerAsync(); 
       //function which takes time because it contacts to a server 
      } 

我怎麼會知道什麼時候我的ButtonClick事件會結束?這樣我的進度條也會結束嗎?

+0

「我怎麼會知道我什麼時候ButtonClick事件會結束?所以我的進度條會結束也?」連線你的BackgroundWorker()控件的** RunWorkerCompleted()**事件,因爲它將在DoWork()方法完成時觸發。從這種情況下,它可以安全地更新控件,如重置按鈕和進度條... – 2013-05-02 03:16:43

回答

0

是的,你應該。這非常簡單。

使後臺工作人員執行任何工作btnProcess_Click做。

有它彙報進展:

worker.WorkerReportsProgress = true; 

現在你可以有這樣的進展報告您訂閱的事件觸發。

worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 

這樣做,你可以創建一個進度條可以比基於此worker_ProgressChanged事件,通過你的計算引發的自我更新。

你可以通過谷歌搜索找到大量的實現。祝你好運,希望這會有幫助。

+0

先生,你能告訴我一個例子嗎?或者關於這個問題的任何例子。因爲我很困惑。 T_T – 2013-05-02 02:30:40

+0

我剛纔說Google。你看過任何結果嗎? [這是一個](http://www.codeproject.com/Tips/83317/BackgroundWorker-and-ProgressBar-demo)。你對什麼感到困惑? – tnw 2013-05-02 12:28:55

0

這是兩個真正的好例子

http://www.dreamincode.net/forums/topic/112547-using-the-backgroundworker-in-c%23/

http://www.dreamincode.net/forums/topic/246911-c%23-multi-threading-in-a-gui-environment/

希望幫助

編輯:

public partial class Form1 : Form 
{ 
    //-------------------------------------------------------------------------- 
    public Form1() 
    { 
     InitializeComponent(); 

     //Initialize backgroundworker 
     Shown += new EventHandler(Form1_Shown); 
     backgroundWorker1.WorkerReportsProgress = true; 
     backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); 
     backgroundWorker1.ProgressChanged += 
     new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); 

     //counter 
     YourObject.Counter = 100; 
    } 

    //-------------------------------------------------------------------------- 
    void btnClick_Clicked(object sender, EventArgs e) 
    { 
     //Trigger the background process 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    //-------------------------------------------------------------------------- 
    void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //Your freakishly long process, 
     //which needs to be run in the background 

     //to make it simple, I'll just do a for loop 
     for (int i = 0; i < 100; i++) 
     { 
      //The counter will keep track of your process 
      //In your case, it might not be a for loop 
      //So you will have to decide how to keep track of this counter 
      //My suggestion is to decrease/increase this counter 
      //right after importants action of your process 
      backgroundWorker1.ReportProgress(YourObject.Counter--); 
     } 
    } 

    void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     //The counter is updated and displayed with a progress bar 
     YourObject.Counter = e.ProgressPercentage; 
    } 
} 
+0

先生,是否有可能知道我的按鈕事件何時完成其所有流程,以便我知道何時結束我的進度條? – 2013-05-02 02:41:36

+0

爲此,請爲您的進度添加計數器。像'int counter;計數器++'給你進步。並使用該計數器來提供給'worker.ProgressChanged + =新的ProgressChangedEventHandler(worker_ProgressChanged);' – 2013-05-02 02:46:37

+0

先生,您可以先解釋一下吧。因爲我是新手,我不能真正按照你的意思。你能讓它更友善嗎? – 2013-05-02 02:50:11