Я пробовал много разных вещей и не могу заставить этот код работать. Мой код, чтобы остановить backgroundworker, затем закрыть окно.Close form after stoppping background worker not working
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (bw.IsBusy)
{
bw.CancelAsync();
e.Cancel = true;
MessageBox.Show("close"); //Does show
return;
}
base.OnFormClosing(e);
}
Во время м.т. рабочего
if (worker.CancellationPending)
{
MessageBox.Show("Cancel"); // Does not show
//Cancel
e.Cancel = true;
}
На завершенного фоне рабочего
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Completed"); //Does not work
//Check if restart
if (bw_restart)
{
bw_restart = false;
bw.RunWorkerAsync();
}
//If it was cancelled
if (e.Cancelled)
{
this.Close();
}
//If error show error message
else if (e.Error != null)
{
MessageBox.Show(e.Error.ToString()); // Does not show
}
else //No errors or cancelled
{
MessageBox.Show(e.ToString()); //Does not shoiw
}
}
Отменить кнопку
private void cancel_Click(object sender, EventArgs e)
{
bw.CancelAsync(); //Does not work :s
}
Это не закрывает окно, в X при нажатии не что-нибудь, я получил он закрывает форму, но не останавливает фонового работника, меня немного смущает. Ссылка на код, который я получил по этой проблеме, которая не работает: How to stop BackgroundWorker on Form's Closing event?
не используйте 'this.Close()', попробуйте использовать 'this.DialogResult = DialogResult.Cancel' вместо этого. (если это работает, я напишу в качестве ответа) – Sayse
В связанном ответе Ханса Пассана он не проверяет e.cancelled в RunWorkerCompleted-Function. Может, это проблема? –
Отладка программы. Посмотрите, будет ли выполняться обработчик BGW, если 'e.Cancelled' истинно. Затем посмотрите, что такое значение 'mClosePending'. Вы уверены, что 'this.Close' вызывается, когда BGW закончен? Если да, поставьте точку останова в обработчике события закрытия окна и посмотрите, снова ли он попал (и если да, то что он делает). – Servy