在BackgroundWorker
的几乎所有教程中,reportProgress事件都是这样处理的(此示例来自MSDN http://msdn.microsoft.com/en-us/library/cc221403(VS.95).aspx)
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()
执行。如何解决这个问题呢?互联网上的给定示例是否真的很糟糕,因为他们建议在循环中调用函数,或者我弄错了?
答案 0 :(得分:2)
是 - 这将执行Load
10次。该示例的目的是说明在估计总体工作负载或报告有意义的进度时的用法。他们只是试图用进度指示来模拟“一些工作”。
如果你不能这样做,那么只需运行它async(通过BackgroundWorker
),但显示滚动无限选框或类似。不要这样做10次; p或者,运行Load
,然后在处理数据时报告进度。假设需要一些时间。如果所有时间都在Load
,那么......