2010-12-16 19 views
13

Uygulamamda, iş parçacığı havuzu kullanarak eşzamansız işlemleri yapan bir kullanıcı denetimim var. parçacığı havuzu yöntemi gibi görünüyor:Denetimin atılmış olup olmadığını algıla.

private void AsyncFunction(object state) 
    { 
     ... do the calculation 
     //refresh the grid data on the UI thread 
     this.BeginInvoke(new MethodInvoker(() => 
               { 
          ... update the ui 
               })); 
    } 

Benim sorunum kullanıcı pencereyi kapatır eğer ... kullanıcı kontrol bertaraf olur olduğunu ve özel durum almak:

çağırır veya Beginınvoke denilen olamaz Pencere tanıtıcısı oluşturuluncaya kadar bir kontrolde.

İletişim kutusunun atılmış olup olmadığını algılamanın bir yolunu biliyor musunuz? Kontrolün kapalı olduğu zaman ayarlanmış bir kontrolde bulunmak istemiyorum. Bunu çözmenin başka bir yolu var mı?

sayesinde

Radu

+0

+1. Çok yararlı bir soru. – Nick

cevap

17
+0

+1: herşey söylendi :) – LaGrandMere

+0

Lütfen sorununuzu çözmesi halinde, doğru cevabı bu şekilde veya başka bir cevap olarak işaretleyiniz. :) –

+1

Aslında, bu vakaların% 100'ünü çözmez. Http://stackoverflow.com/questions/4460709/detect-if-control-was-disposed/4460737#4460737 – Nick

6

Sen Control.IsDisposed özelliğini kullanabilirsiniz.

try 
{ 
    if(!this.IsDisposed) 
    { 
     this.BeginInvoke(new MethodInvoker(() => 

         { 
           // update my control 
         } 
     )); 
    } 
} 
catch (InvalidOperationException) 
{ 
    // Do something meaningful if you need to. 
} 
+0

'a bakın. Bunu nasıl özleyeceğimi bilmiyorum. Açıkça arandı :) –

+0

"BeginInvoke" 'ı çağırmadan önce 'IsDisposed' için kontrol etmeniz gerekir, çünkü kontrol bertaraf edilirse başarısız olur. – max

+0

tamam .. Bunu özledim .. Cevabı düzenledim .. Teşekkür ederim –

0

Ana iş parçacığı sonlandırmak üzere olduğunu çalışma parçacığına işaret etmek EventWaitHandle gibi bir senkronizasyon nesnesi kullanmayı deneyebilirsiniz. Ardından, çalışan iş parçacığı yürütme işlemini sonlandırabilir.

İlgili konular