SORU
13 Kasım 2009, Cuma


Nasıl bir Form'nin Kapatılması olayı BackgroundWorker durdurmak için?

Bir BackgroundWorker olarak çoğaltılır, formun kendi textbox (ana iş parçacığı), dolayısıyla güncelleme gereken bir form var Invoke((Action) (...)); Ara.
HandleClosingEvent sadece bgWorker.CancelAsync() Daha sonra Invoke(...) çağrı ObjectDisposedException, anlaşılır olsun. Ama eğer HandleClosingEvent ben oturabilir ve bgWorker için yapılması gereken, daha bekleyin .(...) Çağırmak asla geri dönmez, aynı zamanda anlaşılır.

Fikirler nasıl istisna veya kilitlenme olmadan bu uygulamayı kapatırım?

Aşağıdaki basit Form1 Sınıfı 3 ilgili yöntemleri:

    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
    }

CEVAP
13 Kasım 2009, Cuma


Biliyorum ki bunu yapmak için kilitlenme-güvenli ve güvenli istisna-tek yol aslında FormClosing olayını iptal etmek. E ayarlayın.Gerçek BGW hala çalışıyor ve kullanıcın yakın bir talep olduğunu belirtmek için ayarlamak = iptal. Eğer ayarlanırsa. sonra BGW. RunWorkerCompleted olay işleyicisi o bayrağı kontrol edin ve Kapatın() çağrı

protected override void OnFormClosing(FormClosingEventArgs e) {
    if (!mCompleted) {
        backgroundWorker1.CancelAsync();
        this.Enabled = false;
        e.Cancel = true;
        mClosePending = true;
        return;
    }
    base.OnFormClosing(e);
}

void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    mCompleted = true;
    if (mClosePending) this.Close();
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • mist64

    mist64

    30 Mayıs 2006
  • Drakinen

    Drakinen

    1 EYLÜL 2008
  • TheFlashCentre

    TheFlashCent

    22 Mayıs 2008