2010-03-17 29 views
7

Nasıl bir Exception bir çok iş parçacığı Başvurusu bir Thread meydana geldiğini öğrenmek olabilir? ve kaynakların ard arda temizliği? Aksi halde, iş parçacığı hala bellekte kalıyor ve çalışıyor olabilir.yakalamak İstisnalar

cevap

5

, yapamayacağınız: Bir iş parçacığı için "iş" fonksiyonu DoWork çağrılırsa sonra böyle bir şey yapmak iş parçacığı başlatılıyor. Örneğin: Yerine

public void Run() 
{ 
    try 
    { 
     Thread thread1 = new Thread(ThreadEntry1); 
     thread1.Start(); 

     Thread thread2 = new Thread(ThreadEntry2); 
     thread2.Start(); 
    } 
    catch (NotImplementedException) 
    { 
     // Neither are caught here 
     Console.WriteLine("Caught you"); 
    } 
} 

private void ThreadEntry1() 
{ 
    throw new NotImplementedException("Oops"); 
} 

private void ThreadEntry2() 
{ 
    throw new NotImplementedException("Oops2"); 
} 

, bu yaklaşım daha kendine yeten ve açıkçası de çalışır: Konu başarısız olmadığını bilmek istiyorum, o zaman WaitHandles dizisi düşünmelisiniz

public void Run() 
{ 
    Thread thread1 = new Thread(ThreadEntry1); 
    thread1.Start(); 
} 

private void ThreadEntry1() 
{ 
    try 
    { 
     throw new NotImplementedException("Oops"); 
    } 
    catch (NotImplementedException) 
    { 
     Console.WriteLine("Ha! Caught you"); 
    } 
} 

ve çağrı yönteminize geri dönün.

Interlocked.Increment(ref _mycounter); 
1

Y. bir çağrı yığını var ve

iyi bir şekilde sizin iplik sarın varsa, ekleyebilir ... parçacığı içine yakalamak ve sanırım günlüğüne iş parçacığı kimliği ekleyebilir Gerekirse ipliğin sona ermesi için yakalama bölümüne kodlama kodu.

+0

Kabul. Bunu bir sorun olarak görmüyorum - bir iş parçacığı başlatıyorsunuz, sizin bir yönteminize giriyorsunuz. – TomTom

2

Bu tür bir şeyden endişe ediyorsanız, iş parçacığı giriş noktasını bir try/catch bloğuna sarmanız ve temizlemeyi açıkça yapmanız gerekir. Konu giriş noktasından geçen herhangi bir istisna uygulamanızın kapanmasına neden olur.

+0

ThreadAbortException'ı .Net 3.5 veya altında varsayılan ayarlarla yakalayamazsınız ve varsayılan ayarlarla birlikte .Net 4.0'da bozuk durumu temsil edebilecek istisnaları yakalayamazsınız. Bu nedenle, varsayılan ayarları kullanarak bir try catch bloğu ile tüm istisnaları yakalayamazsınız (bunu yapmanız önerilmez) –

+3

İpliği iptal etmedikçe ThreadAbortException atarsınız - aynı zamanda onları yakalayabilirsiniz, ancak onları yutmayın –

+0

@ Chris S otomatik olarak yeniden yükseltildikçe, haklısın +1, yutkunma anlamını yakalamak için kullandım, bu politik olarak doğru değil. –

1

Normal işlevlerde yaptığınız gibi özel durumlar içinde istisnaları yakalayabilirsiniz. Sean belirttiği gibi, sen iplik yöntemiyle içindeki tüm özel durum işleme ve temizlik yapmak zorunda

private void DoWork(...args...) 
{ 
try 
{ 
// Do my thread work here 
} 
catch (Exception ex) 
{ 
} 
} 
1

Eric Lippert'ın çalışan iş parçacığı meydana gelen istisnalar kötülüğü ilgili yakın post sahiptir: Alternatif ve daha basit bir yaklaşım sadece sayacını bir iş parçacığının operasyonu bitirir her zaman artırmak etmektir. Bir istisnanın "istisnai" olduğunu ve bir iş parçacığında bir istisnadan sonra emin olabileceğiniz tek şeyin, uygulamanızın durumundan artık emin olamayacağınız olduğunu okumak ve anlamaya değer.