我有一个表单,生成一个 BackoundWorker,它应该更新表单自己的文本框(在主线程上) ,因此 Invoke((Action) (...));
调用。
如果在 HandleClosingEvent
我只做 bgWorker.CancelAsync()
然后我得到 ObjectDisposedException
对 Invoke(...)
呼叫,可以理解。但是如果我坐在 HandleClosingEvent
中等待 bgWorker 完成,那么。调用(...)永远不会返回,这也是可以理解的。
有什么办法可以关闭这个应用程序而不出现异常或死锁吗?
以下是简单的 Form1类的3个相关方法:
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
}