我有一个生成BackgroundWorker的表单,它应该更新表单自己的文本框(在主线程上),因此Invoke((Action) (...));
调用.
如果HandleClosingEvent
我只是做bgWorker.CancelAsync()
然后我得到ObjectDisposedException
的Invoke(...)
电话,可以理解.但是,如果我坐在那里HandleClosingEvent
等待bgWorker完成,那么.Invoke(...)永远不会返回,也是可以理解的.
任何想法如何关闭此应用程序而不会出现异常或死锁?
以下是简单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
}
Run Code Online (Sandbox Code Playgroud)