如何阻止后臺工作人員在表單的閉幕式上工作?我有一個生成背景工作器的表單,它應(yīng)該更新表單自己的文本框(在主線程上),因此Invoke((Action) (...));打電話。如果在HandleClosingEvent我只是想bgWorker.CancelAsync()然后我得到ObjectDisposedException在……上面Invoke(...)打電話,可以理解。但如果我坐在HandleClosingEvent等待bgWorker的完成,而不是.invoke(.)永遠(yuǎn)不會回來,也是可以理解的。任何想法,我如何關(guān)閉這個應(yīng)用程序而沒有得到異常,或僵局?以下是簡單Form 1類的三種相關(guān)方法: 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
}
3 回答

梵蒂岡之花
TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個贊
private bool closePending;protected override void OnFormClosing(FormClosingEventArgs e) { if (backgroundWorker1.IsBusy) { closePending = true; backgroundWorker1.CancelAsync(); e.Cancel = true; this.Enabled = false; // or this.Hide() return; } base.OnFormClosing(e);}void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (closePending) this.Close(); closePending = false; // etc...}

犯罪嫌疑人X
TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個贊
List<Thread> bgWorkersThreads = new List<Thread>();
bgWorkesThreads.Add(Thread.CurrentThread);
foreach (Thread thread in this.bgWorkersThreads) { thread.Abort(); }
CustomTaskPane
COM Exception
CancelAsync()
backgroundworkers
DocumentBeforeClose
- 3 回答
- 0 關(guān)注
- 423 瀏覽
添加回答
舉報
0/150
提交
取消