2009-03-09 43 views
2

UI iş parçacığı üzerinde (Progress Bar) bir pencere denetiminin neden olduğu başka bir iş parçacığında uzun işlem yaparken TargetInvocationException'ı aldım. Bu istisna benim app çökmesine yol açar (hata ayıklamada ana yönteme gider) ve yakalama tarafından yakalanamadı. Bu istisnayı neyin yaptığını çözdüm ve düzeltin (bu, "Değer" özelliğini, maksimum değeri aşan bir değere atamaya çalışıyordu). Ancak, bu gibi bir istisnayı nasıl yakalayabildiğimi merak ettim (üretim kodunda) bu yüzden uygulamayı sonlandırmak yerine başvurumu kurtarmam için bir seçeneğim var.Çoklu iş parçacığında TargetInvocationException'dan incelikle nasıl kurtarılır?

cevap

2

Çok fazla iyileşme şansınız yok. İşleminiz açısından, çok sayıda yığın çerçevenin (ve bu yığın çerçevelerinden referans alınan nesnelerin) durumu, hata nedeniyle geçersizdir. Bu nedenle, en iyi seviyede çok iyileşebilir ve işlemi tekrar deneyebilirsiniz.

Erişmekte olduğunuz kaynaklar bir işlemde bulunabiliyorsa, bunu yapmayı öneririm, böylece kalıcı verilerde tutarsızlıklar hakkında endişelenmenize gerek kalmaz. Ayrıca

, SO üzerinde Konuyu kontrol etmek isteyebilirsiniz:

Best Practice for Exception Handling in a Windows Forms Application?

yanı sıra Microsoft'tan durum işleme Uygulama bloğu:

http://msdn.microsoft.com/en-us/library/cc309505.aspx

+0

@casperOne: "İşleminiz açısından, çok sayıda yığın çerçevenin (ve bu yığın çerçevelerinden başvurulan nesnelerin) durumu, hata nedeniyle geçersiz olabilir." Bu en olası faktör gibi görünüyor, benim durumumda istisna defalarca 600'den fazla kez atılmıştı. –

0

Yakalama istisna ve Ana veya çağrı koduna geri göndermek için bir mekanizma bulun.

2

Statik olay Application.UnhandledException aracılığıyla GUI iş parçacığı üzerinde 'özel durumları' (gerçekten, yalnızca bildirim alıyorsunuz) 'işleyebilirsiniz'.

Bu etkinliğe bir işleyici eklediğinizde, WinForms UI (ileti pompası) iş parçacığı üzerindeki tüm işlenmeyen özel durumlar için çağrılır. Bu işleyicinin eklenmiş olması gerçeği, Application'un çıkmayacağı anlamına gelir. Bu olmadan, WinForms uygulamanızı kapatır.

0

Kullandığınız 3.0 sürümü ile bu satırlarda bir şey yapabiliyorsanız .net'in hangi sürümünü kullandığınızdan emin olun.

private void UpdateValue(int newValue) 
{ 
    Action myAction =() => progressBar.Value = newValue; 

    if (progressBar.InvokeRequired) 
     progressBar.Invoke(myAction); 
    else 
     myAction(); 
} 

Çağrı o çağrı ihtiyaçları marshalling olmadığını kontrol edin ve uygun çağrı yapacaktır ilerleme çubuğu için yeni bir değerle bu yöntem. Dikkatli olun InvokeRequired nispeten pahalıdır, bu yüzden sadece gerektiği yerlerde kullanın. Gerekirse, bu modelin diğer denetimler için genel kullanımını sağlamak için bunu bir uzantı yöntemine dönüştürebilirsiniz.

Bu yardımcı olur umarım.

+0

@Dean: UI iş parçacığının diğer iş parçacığı formuna erişmemesinden kaynaklanan istisna, bu durum uygun şekilde doğru değildir. o zaman, örneğin orada (benimAksiyon) çağırma diyelim ki burada istisna atılan ve yakalanamadığı yerde. bir deneyin ve görsün ... teşekkür ederim –

İlgili konular