首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

CLR 可靠性深度解析:非同步例外、CER 與 SafeHandle

     編輯:關於.NET

非同步例外的威脅

OutOfMemoryException、StackOverflowException、ThreadAbortException 可在任意指令間發生,不可預測、不可靠捕獲。執行緒中止更會在隨機點拋出例外,導致 finally 區塊可能不執行。

三種復原模型

  1. 進程回收:ASP.NET 模式,犧牲單一請求換取整體存活。
  2. 鏡像進程:雙進程熱備份,NASA 多數決架構。
  3. AppDomain 卸載:SQL Server 模式,將故障隔離於單一 AppDomain,卸載釋放資源。

受限執行區域 (CER)

讓執行階段盡力保證特定程式碼區塊執行完畢:

  • RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup
  • RuntimeHelpers.PrepareConstrainedRegions() + try/finally(finally 為 CER)
  • 關鍵終結器 (CriticalFinalizerObject) 及 SafeHandle.ReleaseHandle

CER 區塊內:預先 JIT 編譯、禁用執行緒中止、檢查堆疊溢位。

可靠性契約

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static void InsertItem<T>(ReliableList<T> list, T item) { ... }

告知呼叫端:失敗時不會損壞狀態,可安全重試或忽略。

SafeHandle:作業系統控制碼的正確封裝

  • 繼承 SafeHandleZeroOrMinusOneIsInvalid,實作 ReleaseHandle(CER 方法)。
  • 防止控制碼重用攻擊、終結器競態條件。
  • P/Invoke 簽名直接使用 SafeFileHandle 等強型別,跨平台安全。

鎖與記憶體失敗點

  • 避免在 string、Type、CultureInfo、陣列等可能跨 AppDomain 的物件上 lock。
  • MemoryFailPoint 預測記憶體不足,拋 InsufficientMemoryException(軟 OOM),避免硬 OOM 觸發擴大策略。

實務建議

  • 客戶端應用:依賴進程重啟(Windows Vista Restart Manager 保存狀態)。
  • 程式庫作者:使用 SafeHandle、實作 CriticalFinalizerObject、標註 ReliabilityContract。
  • 伺服器端:採用 AppDomain 隔離與 CER 保護關鍵資源釋放路徑。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved