Почему вы не используете фоновые рабочие ReportProgress
-метод ? Он существует именно для этой цели.
Подпишитесь на ProgressChanged
-event и обновляйте оттуда индикатор прогресса.
// Wherever you instanciate your BackgroundWorker
backgroundWorker1.ProgressChanged += (o, e) => progressBar1.Value = e.ProgressPercentage;
// Your DoWork method
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
Convert();
backgroundWorker1.ReportProgress(i);
}
// Bitrate();
}
Поскольку этишаги в процентах, вы также должны установить минимальное и максимальное значение индикатора выполнения. Вы уже установили значение и шаг, но не должны делать это в методе DoWork
. Сделайте это где-нибудь еще, например, перед вызовом backgroundWorker1.RunWorkerAsync()
.
Также обратите внимание, что я сделал цикл for 1-100, так как мы работаем с процентами. Вы также можете сделать 0-99 и сообщить i + 1.
progressBar1.Value = 0;
progressBar1.Step = 1;
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
Редактировать 1:
Как упомянуто в комментариях, я забыл о возможности создания BackgroundWorker
с winformsдизайнер. В этом случае вы должны использовать конструктор вашей Формы (или UserControl), чтобы подписаться на событие ProcessChanged
.
Редактировать 2:
Чтобы ответить на дополнительный вопрос о сбросеПосле выполнения работника ProgressBar я покажу вам два возможных решения.
// You can directly subscribe to RunWorkerCompleted using a lambda like before
backgroundWorker1.RunWorkerCompleted += (o, e) => progressBar1.Value = 0;
// Or you can use a method (useful if you have other things to do when the worker is done)
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Value = 0;
// some more stuff
}
// Subscribe to RunWorkerCompleted with this method
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
В обоих решениях подписка на RunWorkerCompleted
должна быть установлена непосредственно до или после подписки на ProgressChanged
(в данном случае это означает, что в конструкторе).