Почти во всех уроках 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()
. Как решить эту проблему? Являются ли приведенные примеры в интернете действительно плохими, потому что они предлагают вызывать функцию в цикле, или я ошибся?