У меня есть задача, которая занимает много времени для выполнения. Для информирования пользователя прогресса у меня есть индикатор выполнения, который я обновляю внутри DoWork
.
Кто-либо может сказать мне, если это - лучший способ обновить индикатор выполнения? Я услышал, что существует a ReportProgress
обработчик событий, но я смущен, потому что я не уверен в цели ReportProgress
.
Событие ProgressChanged - это то, что вы ищете. Однако убедитесь, что вы создали BackgroundWorker, как показано ниже, чтобы он действительно вызывал это событие при вызове ReportProgress.
BackgroundWorker bw = new BackgroundWorker() { WorkerReportsProgress = true };
bw.ProgressChanged += ... ;
Поскольку фоновый воркер работает в отдельном потоке, вы столкнетесь с проблемами, если попытаетесь получить доступ к объектам пользовательского интерфейса. Вызов метода ReportProgress для рабочего из обработчика DoWork вызывает событие ProgressChanged. Это событие должно обрабатываться в потоке пользовательского интерфейса, чтобы можно было легко получить доступ к элементу управления.
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += DoWorkHandler;
worker.WorkerReportsProgress = true;
worker.ProgressChanged += (s, e) =>
{ myProgressBar.Value = e.ProgressPercentage; };
worker.RunWorkerAsync();
...
public void DoWorkHandler(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while (working)
{
// Do Stuff
worker.ReportProgress(progressPercentage);
}
}
ReportProgress - это то, что вы использовали бы для обновления хода выполнения вашей задачи, включая такие вещи, как пользовательский интерфейс - в вашем случае - индикатор выполнения.
Вам следует ознакомиться с документацией MSDN, расположенной здесь .
в основном вы создаете обработчик для события ReportProgress, затем в DoWorkEventHandler вызываете ReportProgress следующим образом:
worker.ReportProgress((i * 10));