代码之家  ›  专栏  ›  技术社区  ›  SMUsamaShah

BackgroundWorker.ReportProgress令人困惑的例子?

  •  1
  • SMUsamaShah  · 技术社区  · 15 年前

    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()

    1 回复  |  直到 15 年前
        1
  •  2
  •   Marc Gravell    15 年前

    是的-那就行了 Load 10次。该示例的目的是说明在您可以估计总体工作负载或报告有意义的进度时的用法。他们只是试图用进度指示来模拟“一些工作”。

    BackgroundWorker 加载 过程 数据。假设这需要一些时间。如果所有的时间都在 加载 ,然后。。。