2012-12-14 2 views
7

Что я хочу, когда какой-то метод выполняет некоторую задачу, пользовательский интерфейс остается активным, и я хочу показать ход работы в строке выполнения.Запуск метода в 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 «Готово».

+2

Является ли ваша функция parseFiles вызовом 'ReportProgress'? – McAden

+0

Да. Это здесь. Извините, я забыл добавить его ранее. –

ответ

16

Вместо использования одного метода 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"); 
} 
+0

Можете ли вы прокомментировать, как отключить кнопку, когда работает BackGroundWorker. В противном случае возникла бы проблема. –

+0

@ soham.m17 конечно, просто установите свойство 'parseButton.Enabled' при запуске синтаксического анализа, и когда разбор завершится –

+0

Но это в другой теме. Поэтому он должен исключать исключение в «RunWorkerCompleted» eventHandler. Но это не метание? Могу я узнать почему? –

0

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

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

0

To. 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 
    } 
} 
Смежные вопросы