Лучше всего это сделать с помощью диалогового окна, которое автоматически делает остальную часть вашего интерфейса недоступной. Добавьте новую форму в ваш проект и поместите ProgressBar и кнопку на него. И добавьте публичный метод, чтобы вы могли обновить индикатор выполнения из обработчика событий в основной форме:
public partial class ProgressDialog : Form {
public ProgressDialog() {
InitializeComponent();
}
public void ShowProgress(int progress) {
progressBar1.Value = progress;
}
private void CancelProcess_Click(object sender, EventArgs e) {
this.DialogResult = DialogResult.Cancel;
}
}
Вам нужно будет отобразить диалоговое окно при запуске работника:
ProgressDialog dlg;
private void RunProcess_Click(object sender, EventArgs e) {
backgroundWorker1.RunWorkerAsync();
using (dlg = new ProgressDialog()) {
dlg.ShowDialog(this);
}
dlg = null;
if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync();
}
Обратите внимание, как он вызывает метод CancelAsync (), чтобы остановить работника, поэтому закрытие диалога достаточно для его остановки. Вам нужно будет обновить индикатор выполнения:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
dlg.ShowProgress(e.ProgressPercentage);
}
И вам нужно автоматически закрыть диалоговое окно, когда работник завершит работу, а пользователь сам не закроет диалоговое окно:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
if (dlg != null) dlg.Close();
}