it-roy-ru.com

Запуск метода в BackGroundWorker и отображение ProgressBar

Я хочу, чтобы какой-то метод выполнял какую-то задачу. Пользовательский интерфейс поддерживает себя активным, и я хочу показать ход работы в индикаторе выполнения.

У меня есть метод BackGroundWorker и Progressbar. Я хочу вызвать метод, когда BackGroundWorker начинает работать и показать прогресс. Метод содержит цикл. Таким образом, он может сообщить о прогрессе.

Так что можно сделать?

private void Form1_Load(object sender, EventArgs e)
{
    // TODO: This line of code loads data into the 'dataSet1.TBLMARKET' table. You can move, or remove it, as needed.
    myBGWorker.WorkerReportsProgress = true;
}

private void myBGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    parseFiles();
}

private void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    myProgressBar.Value = e.ProgressPercentage;
}

private void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    MessageBox.Show("Done");
}

private void parseButton_Click(object sender, EventArgs e)
{
    myBGWorker.RunWorkerAsync();
}

public void parseFiles()
{
  for()
  {
     //parsing
     myBGWorker.ReportProgress(...);
  }
}

Но это не работает. Progressbar не обновляется. После MessageBox "Done" отображается только небольшой прогресс.

9
soham

Вместо использования одного метода ParseFiles (который должен зависеть от myBGWorker) используйте цикл и метод, который анализирует один файл. Отчет о прогрессе в этом цикле:

private void parseButton_Click(object sender, EventArgs e)
{
    parseButton.Enabled = false;
    myBGWorker.RunWorkerAsync();
}

private void myBGWorker_DoWork(object sender, DoWorkEventArgs e)
{
   for(int i = 0; i < filesCount; i++)
   {  
       ParseSingleFile(); // pass filename here
       int percentage = (i + 1) * 100 / filesCount;
       myBGWorker.ReportProgress(percentage);
   }
}

void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    myProgressBar.Value = e.ProgressPercentage;
}

void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    parseButton.Enabled = true;
    MessageBox.Show("Done");
}
20
Sergey Berezovskiy

Для. soham.m17 использование с аргументом отправителя

private void myBGWorker_DoWork(object sender, DoWorkEventArgs e)
{
   var worker = sender as BackgroundWorker;
   for(int i = 0; i < filesCount; i++)
   {  
       ParseSingleFile(); // pass filename here
       int percentage = (i + 1) * 100 / filesCount;
       worker.ReportProgress(percentage);  // use not myBGWorker but worker from sender
   }
}
0
Namo

Я извиняюсь за вопрос. На самом деле код работает нормально. Он не отображал Progressbar, поскольку аргумент в myBGWorker.ReportProgress() был дробным, а не процентным. Таким образом, это не показывало это. Приносим извинения за неудобства.

Модератор может удалить эту тему. В противном случае это может быть учебник для других.

0
soham