2010-06-21 129 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