2013-10-17 63 views
2

我的形式創建一個BackgroundWorker過程..進度條和運行方法在背景中的BackgroundWorker

BackgroundWorker bw = new BackgroundWorker 
     { 
      WorkerReportsProgress = true, 
      WorkerSupportsCancellation = true 
     }; 

另外,我具有形式(進度條最小內部的進度條控制和最大值是1和100)。

在我按一下按鈕,

在click事件就會觸發,這是爲了在後臺和並行運行的實際方法調用,開機有顯示進度條的步驟....

if (bw.IsBusy) 
{ 
    return; 
} 

bw.DoWork += (bwSender, bwArg) => 
{ 
    MethodCall1(); - Does some database insertions.. 
    MethodCall2(); - Does some database select... 
} 

bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 

bw.RunWorkerCompleted += (bwSender, bwArg) => 
{ 

    bw.Dispose();     
}; 

bw.RunWorkerAsync(); 

進度條顯示的進展...

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar.Value = e.ProgressPercentage; 
} 

我所面臨的問題是,進度條沒有踏,它固步自封,沒有進度條的進度。

我也嘗試在我的實際方法中插入bw.ReportProgress(integervalue),但它沒有幫助。

我怎樣纔能有一個backgroundworker線程處理方法調用,並行顯示進度條的進度,方法調用完成後,我想結束進度條步驟。

+0

如果設置是達到bw_ProgressChanged斷點? e.ProgressPercentage是否具有您期望的價值? progressBar的最小/最大值與e.ProgressPercentage中的值相比是多少? –

+6

顯然,您的代碼缺少必需的ReportProgress()調用,因此進度條不會移動。計算一個有意義的進度值並不總是可能的,你並不總是知道dbase引擎正在做什麼。唯一的選擇是使用ProgressBar.Style = Marquee。 「工作而非死亡」選項。 –

+0

如果我將進度條的樣式設置爲選取框,則可以看到進度條,但是當我將其更改爲塊時,我看不到進度條的進度。 – Sharpeye500

回答

2

正如其他人在評論中所述,您應該將事件的接線移至窗體構造函數或初始化方法。如果您將它們添加到BackgroundWorker的每個按鈕單擊上,然後這些方法將在第二次點擊上執行兩次,第三次單擊上執行三次,等等。

嘗試在您的DoWork代碼中調用方法後正確地調用ReportProgress調用。正如漢斯在上面所說的,除非您對方法調用相對於對方多長時間有很好的瞭解,否則這並不能準確表示進度。

至於Dispose,BackgroundWorker繼承了Component,它實現了IDisposable。但是,BackgroundWorker不會覆蓋基本實現以實際處理任何東西,因此只需將其從組件集合中移除即可。它不需要明確調用。

嘗試是這樣的:

public partial class Form1 : Form 
{ 
    BackgroundWorker bw = new BackgroundWorker 
    { 
     WorkerReportsProgress = true, 
     WorkerSupportsCancellation = true 
    }; 

    public Form1() 
    { 
     InitializeComponent(); 

     bw.DoWork += (bwSender, bwArg) => 
     { 
      //MethodCall1(); - Does some database insertions.. 
      bw.ReportProgress(50); 
      //MethodCall2(); - Does some database select... 
      bw.ReportProgress(100); 
     }; 

     bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 

     bw.RunWorkerCompleted += (bwSender, bwArg) => 
     { 

     }; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (bw.IsBusy) 
     { 
      return; 
     } 

     bw.RunWorkerAsync(); 
    } 

    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progressBar1.Value = e.ProgressPercentage; 
    } 
}