BackgroundWorker.ReportProgress приводят в замешательство примеры? - PullRequest
1 голос
/ 22 июня 2010

Почти во всех уроках 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 Ответ

2 голосов
/ 22 июня 2010

Да - это будет выполнено Load 10 раз. Цель этого примера - проиллюстрировать использование, когда вы можете оценить общую нагрузку или сообщить о значительном прогрессе. Они просто пытаются смоделировать «некоторую работу» с указанием прогресса.

Если вы не можете этого сделать, просто запустите его асинхронно (через BackgroundWorker), но покажите прокрутку с бесконечной прокруткой или аналогичное. Не делайте этого 10 раз; p В качестве альтернативы, запустите Load, а затем сообщите о прогрессе, когда вы обработаете данные. Предполагая, что это займет некоторое время. Если все время в Load, то ...

...