WPF

18

için Çocuk Konuları İçinde İşlenmeyen Özel Durumları Yakalama Birkaç iş parçacığını dağıtan bir WPF uygulamasına sahibim. Ayrıntılı bir hata iletisi görüntüleyen App.xaml.cs dosyasında bir DispatcherUnhandledException olay işleyicisi tanımladım ve bu işleyici, UI iş parçacığının bir istisna her karşılaştığında çağrılır. Sorun çocuk konuları ile ilgilidir: işlenmemiş istisnalar asla ele alınmaz. Bunu nasıl yaparım?WPF

örnek kod:

private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 
{ 
    MessageBox.Show("detailed error message"); 
} 

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    //... 
    //If an Exception is thrown here, it is handled 
    //... 

    Thread[] threads = new Thread[numThreads]; 
    for(int i = 0; i < numThreads; i++) 
    { 
     threads[i] = new Thread(doWork); 
     threads[i].Start(); 
    } 
} 

private void doWork() 
{ 
    //... 
    //Exception thrown here and is NOT handled 
    //... 
} 

Düzenleme: işlenmeyen bir özel durum meydana sonra, bir yığın izleme bir hata mesajı görüntülenir ve o zaman uygulamadan çıkmak istiyoruz.

cevap

17

AppDomain.CurrentDomain.UnhandledException olayına da bağlanmayı deneyin.

+1

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx adresine bakın, bunun neden yalnızca hatadan çıkmadan önce günlüğe kaydedileceğini okuyun. –

+0

@Henk, zaten gönderdiğim bağlantıyı gösteriyor. Ancak haklısınız, istisna sadece kayıt amaçlı kullanılmalıdır. – Brandon

+0

Brandon, Tamam, Bağlantınızı kontrol etmedim (-: Fakat her bir iş parçacığının kendi istisnalarını yerine getirmesi gerektiği sonucu çıkar. –

3

Bu, tasarım gereği, DoWork'un en üst düzeyinde bir try/catch kullanmanız gerekir. Bazı iş parçacığı modelleri bunun için bir örnek, bir örnek için Backgroundworker bir göz atın.

.NET 4 Görev sınıfı bu soruna güzel bir arabirim sağlar. O zamana kadar, kendinize dikkat etmeniz veya BGW veya IAsyncResult modellerini kullanmanız gerekecektir.

+0

Bu çok geçerli bir cevap, fakat benim durumum için uzun ve karmaşık bir süreç yürütüyorum. anlayabildiğim kadarıyla, blokları deneyin oldukça iyi bir performans cezası empoze edin, ve bunları sadece küçük kod parçaları üzerinde kullanmayı tercih ediyorum. – Phil

+3

Hayır, deneyin/yakalama sadece performansı etkiler _when_ bir istisna atılır ve o zaman hız genellikle en büyük sorun değil, normal durumda hiçbir dezavantaj yoktur.Ve bir istisna 'bir iş parçacığından' kaçar 'sonra, tüm uygulamanızın istikrarı söz konusudur. –

+0

Tamam, bu mantıklı. benim için. – Phil