У меня есть форма, которая порождает BackgroundWorker, который должен обновить собственное текстовое поле формы (в главном потоке), следовательно, Invoke((Action) (...));
call.
Если в HandleClosingEvent
я просто делаю bgWorker.CancelAsync()
, тогда я получаю ObjectDisposedException
на Invoke(...)
звонке, понятно. Но если я сижу в HandleClosingEvent
и жду выполнения bgWorker, то .Invoke (...) никогда не возвращается, также понятно.
Есть идеи, как закрыть это приложение, не получив исключение или тупик?
Ниже приведены 3 соответствующих метода простого класса Form1:
public Form1() {
InitializeComponent();
Closing += HandleClosingEvent;
this.bgWorker.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
while (!this.bgWorker.CancellationPending) {
Invoke((Action) (() => { this.textBox1.Text = Environment.TickCount.ToString(); }));
}
}
private void HandleClosingEvent(object sender, CancelEventArgs e) {
this.bgWorker.CancelAsync();
/////// while (this.bgWorker.CancellationPending) {} // deadlock
}