2010-06-21 105 views
1

在幾乎所有的reportProgress事件也被類似處理的BackgroundWorker教程(這個例子是從MSDN http://msdn.microsoft.com/en-us/library/cc221403(VS.95).aspxBackgroundWorker.ReportProgress令人困惑的例子?

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
BackgroundWorker worker = sender as BackgroundWorker; 

    for (int i = 1; (i <= 10); i++) 
    { 
    if ((worker.CancellationPending == true)) 
    { 
     e.Cancel = true; 
     break; 
    } 
    else 
    { 
     // Perform a time consuming operation and report progress. 
     // _results.Load() downloads XML and save the data to database 
     System.Threading.Thread.Sleep(500); 
     worker.ReportProgress((i * 10)); 
    } 
    } 
} 

我的功能下載XML和解析後,將它保存到數據庫中。我在下面調用了這個函數「//執行耗時的操作並報告進度。」但是我的函數不會運行10次嗎?

後來我修改了Load()添加到變量CountTotal(結果總數)和CountLoaded(保存的結果數量,它隨着函數的進展而變化)。

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
BackgroundWorker worker = sender as BackgroundWorker; 

    for (int i = 1; (i <= 10); i++) 
    { 
    if ((worker.CancellationPending == true)) 
    { 
     e.Cancel = true; 
     break; 
    } 
    else 
    { 
     // Perform a time consuming operation and report progress. 
     _results.Load() downloads XML and save the data to database 

     worker.ReportProgress((_results.CountLoaded * 10)); //i did something like this 
    } 
    } 
} 

的問題是,worker.ReportProgress_results.Load()完成後執行。如何解決這個問題呢?互聯網上給出的例子是否真的很糟糕,因爲他們建議在循環中調用函數,或者我弄錯了它們?

回答

2

是 - 那將執行Load 10次。這個例子中的意圖是說明你可以估計總體工作量或者報告有意義的進度的用法。他們只是試圖模擬「一些工作」,並顯示進度。

如果你不能這樣做,那麼只需運行異步(通過BackgroundWorker),但顯示滾動無限選取框或類似。不要做10次; p或者,運行Load,然後報告進度進程的數據。假設需要一些時間。如果一直在Load,那麼...

+0

謝謝,花了很多時間後。正如你所說的,我用了大框。但有沒有什麼辦法可以使用CountTotal和CountLoaded來報告進度條上的進度? – SMUsamaShah 2010-06-21 23:00:15

+0

@ LifeJ20 - 如果發生事件或類似事件,可能會在保存後觸發。 – 2010-06-21 23:07:36

+0

我可以製作另一個BackgroudWorker來監控Count.Loaded – SMUsamaShah 2010-06-21 23:09:20