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

  • sinumatic

    sinumatic

    19 Aralık 2006
  • SomeOne Pro

    SomeOne Pro

    25 EKİM 2013
  • UCBerkeley

    UCBerkeley

    3 Mayıs 2006