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
Ç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:
Yakalama istisna ve Ana veya çağrı koduna geri göndermek için bir mekanizma bulun.
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.
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.
@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 –
- 1. Bir C# udp soket istisnasından incelikle nasıl kurtarılır?
- 2. COM hatasından nasıl kurtarılır?
- 3. SensorEventListener ayrı iş parçacığında
- 4. Ayrı bir iş parçacığında
- 5. Arka plan iş parçacığında LoadKeyboardLayout nasıl kullanılır?
- 6. Yeni bir iş parçacığında nasıl hizmet başlatabilirim?
- 7. V8'i bir iş parçacığında nasıl kullanırım?
- 8. Diğer iş parçacığında istisna nasıl hata ayıklanır?
- 9. OnStop() ana iş parçacığında çağrılıyor
- 10. Sadece bir iş parçacığında çalışan birkaç 'iş parçacığı' nasıl işlenir
- 11. Rserve'i incelikle nasıl kapatabilirim?
- 12. chrome.usb'deki duraktan nasıl kurtarılır?
- 13. Mariadb nasıl incelikle kesilir?
- 14. "main" iş parçacığında özel durum java.util.UnknownFormatConversionException: Conversion = '.'?
- 15. İşlev yalnızca ana iş parçacığında çağrılabilir, neden?
- 16. Bir iş parçacığında THTTPReqResp bileşenini yok edemiyor
- 17. "main" iş parçacığında özel durum java.lang.NoSuchFieldError: TRACE
- 18. "main" iş parçacığında özel durum java.lang.ClassNotFoundException:
- 19. UI iş parçacığında viewbyid çağrılabilir mi?
- 20. "main" iş parçacığında özel durum java.lang.Error LUCENE
- 21. Neden invokeLater ana iş parçacığında yürütülür?
- 22. pdb başka bir iş parçacığında kırılamıyor?
- 23. Çoklu iş parçacığı nasıl ekleyebilirim?
- 24. Silverlight'ta, kodun UI iş parçacığında çalışıp çalışmadığını nasıl anlarsınız?
- 25. Qt5: Bir iş parçacığında nasıl bir sinyal beklemeli?
- 26. Özel durumu "ana" iş parçacığında nasıl giderebilirim java.util.ConcurrentModificationException
- 27. Arka plan iş parçacığında istisna nedeniyle android uygulaması nasıl engellenir?
- 28. Birden çok iş parçacığında bir MemoryStream akışını okuma
- 29. Tek bir iş parçacığı kullanarak çoklu iş parçacığını nasıl gerçekleştirirsiniz?
- 30. Android'de çoklu iş parçacığı nasıl çalışır?
@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ı. –