第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何阻止后臺工作人員在表單的閉幕式上工作?

如何阻止后臺工作人員在表單的閉幕式上工作?

回首憶惘然 2019-06-05 14:33:32
如何阻止后臺工作人員在表單的閉幕式上工作?我有一個生成背景工作器的表單,它應(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個贊

我所知道的唯一的死鎖安全和異常安全的方法是實(shí)際上取消FormCling事件。如果BGW仍在運(yùn)行,則設(shè)置e.Cancel=true,并設(shè)置標(biāo)志以指示用戶請求關(guān)閉。然后在BGW的RunWorkerCompleted事件處理程序中檢查該標(biāo)志,如果設(shè)置了它,則調(diào)用Close()。

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...}


查看完整回答
反對 回復(fù) 2019-06-05
?
犯罪嫌疑人X

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個贊

我找到了另一條路。如果您有更多的背景工作人員,您可以:

List<Thread> bgWorkersThreads  = new List<Thread>();

在每個后臺工作人員的DoWork方法中:

bgWorkesThreads.Add(Thread.CurrentThread);

您可以使用的Arter:

foreach (Thread thread in this.bgWorkersThreads) {
     thread.Abort();    }

我在Word外接程序控件中使用了這個,我在CustomTaskPane..如果有人提前關(guān)閉文檔或應(yīng)用程序,那么我所有的后臺工作都完成了他們的工作,這會引發(fā)一些COM Exception(我記不清是哪一個)。CancelAsync()不管用。

但是有了這個,我可以關(guān)閉所有由backgroundworkers立即進(jìn)入DocumentBeforeClose我的問題解決了。


查看完整回答
反對 回復(fù) 2019-06-05
  • 3 回答
  • 0 關(guān)注
  • 423 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號