Вы уже делаете это почти правильно. BackgroundWorker
имеет встроенный механизм для сообщения о прогрессе уже.
public Form1()
{
bw1.WorkerReportsProgress = true;
bw1.ProgressChanged += bw1_ProgressChanged;
bw1.DoWork += bw1_DoWork;
bw1.RunWorkerAsync();
}
private void bw1_DoWork(object sender, DoWorkEventArgs e)
{
var worker = sender as BackgroundWorker;
while (workNotDone)
{
//Do whatever work
worker.ReportProgress(CalculateProgressDonePercentage());
}
}
private void bw1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//This is called on GUI/main thread, so you can access the controls properly
progressBar.Value = e.ProgressPercentage;
}
Если, конечно, вы просто не пытаетесь анимировать индикатор выполнения, фактически не сообщая о каком-либо прогрессе, в этом случае вам, вероятно, следует просто использовать тип Marquee
, который автоматически прокручивает индикатор выполнения, ничего не делая. Или просто используйте фоновый поток с Thread.Sleep()
.