У меня есть форма, которая порождает BackgroundWorker, которая должна обновлять форму собственного текстового поля (в основном потоке), следовательно Invoke((Action) (...));
вызов.
Если в HandleClosingEvent
я просто делаю bgWorker.CancelAsync()
, тогда я получаю вызов ObjectDisposedException
on 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
}