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

  • PlayStation

    PlayStation

    16 Aralık 2005
  • Music EuroDance 2

    Music EuroDa

    12 Mayıs 2011
  • Within Temptation

    Within Tempt

    18 EYLÜL 2006