簡體   English   中英

如何在多線程中從 TargetInvocationException 中優雅地恢復?

[英]How to recover gracefully from TargetInvocationException in multi thread?

我在另一個線程中執行長進程時遇到 TargetInvocationException,這是由 UI 線程(進度條)上的 windows 控件引起的。 此異常導致我的應用程序崩潰(在調試中轉到 main 方法)並且無法被 try catch 捕獲。 我弄清楚是什么造成了這個異常,並修復了它(試圖通過超過最大值的值分配“Value”屬性)。 但這讓我想知道如何捕獲這樣的異常(在生產代碼中),所以我可以選擇恢復我的應用程序而不是終止應用程序。

您可能無法恢復很多。 就您的操作而言,大量堆棧幀(以及從這些堆棧幀引用的對象)的 state 可能由於錯誤而無效。

因此,充其量您可以恢復到非常高的水平並再次嘗試操作。

如果您正在訪問的資源能夠包含在事務中,那么我建議您這樣做,這樣您就不必擔心持久數據的不一致。

此外,您可能想在 SO 上查看此線程:

Windows Forms 應用程序中異常處理的最佳實踐?

以及來自 Microsoft 的異常處理應用程序塊:

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

您可以通過 static 事件Application.UnhandledException在 GUI 線程上“處理”異常(實際上,您只是收到通知)。

當您將處理程序附加到此事件時,將針對 WinForms UI(消息泵)線程上的所有未處理異常調用它。 您附加了這個處理程序的事實意味着Application不會退出。 沒有它,WinForms 將關閉您的應用程序。

捕獲異常並找到一種機制將其傳遞回主代碼或調用代碼。

不確定您使用的是哪個版本的 .net,如果它是 3.0+,您可以按照這些方式做一些事情。

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

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

使用進度條的新值調用此方法,它將檢查調用是否需要編組並進行適當的調用。 注意 InvokeRequired 相對昂貴,所以只在需要的地方使用它。 如果需要,您可以將其作為擴展方法,以便將此模式用於其他控件。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM