【发布时间】:2010-12-16 10:14:26
【问题描述】:
我有一个生成 BackgroundWorker 的表单,它应该更新表单自己的文本框(在主线程上),因此 Invoke((Action) (...)); 调用。
如果在HandleClosingEvent 我只是做bgWorker.CancelAsync() 然后我在Invoke(...) 电话上得到ObjectDisposedException,这是可以理解的。但是,如果我坐在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
}
【问题讨论】:
-
您是否尝试过使用 BegingInvoke 而不是 Invoke,这样您就不必等到调用消息返回?
-
是的。没有死锁,但我不知道 BeginInvoke 何时被处理(在主线程上),所以我回到 ObjectDisposed 异常。
标签: c# winforms multithreading backgroundworker