全局接口表 (GIT) 存儲接口指針,以便可以跨單元安全地訪問它們。在一個單元中添加的對象可以從 GIT 中移除,并且可以在另一個單元中訪問。當接口被添加到 GIT 中的時候,將在 DWORD 中返回一個 Cookie。該 DWORD 需要存儲在隊列中,以便輔助線程可以簡單地將該 DWORD 彈出隊列,并且使用 GIT 提取與該 Cookie 相對應的 .NET 異常對象。
該異常的引發日期和時間也需要記錄在隊列中的元素內部?紤]以下情況:錯誤被引發,自定義的 SetErrorInfo 函數被調用,異常被添加到隊列中,并且輔助線程被通知發布該異常。如果該輔助線程在一段時間內沒有得到調度,則即使只過了幾秒鐘,其他異常也可能在第一個異常被實際發布之前被添加到隊列中。因而,事件日志中實際記錄的時間將與引發該錯誤的實際時間稍微不同步。因此,所記錄的時間是至關重要的。所記錄的時間和 .NET 異常 Cookie 將包裝在結構內部,該結構將被添加到隊列中。
因為 STL 隊列類不是線程安全的,并且需要完成少量工作以便向隊列中添加異常,所以創建了 ManagedExceptionQueue 類。這將使用類臨界區來保護對隊列進行的同時訪問,將 GIT 的使用包裝到該類上的 push 和 pop 函數中,并且為輔助線程和自定義掛鉤函數提供了一個良好的接口,以便在隊列中設置和檢索異常信息。該過程顯示在圖 5 中。

圖 5 兩個通過 CCW 引發異常的客戶端
在自定義 SetErrorInfo 函數將異常添加到隊列中以后,就會在輔助線程內部產生一個事件,以通知它可以發布異常。隊列類的代碼存在于 MSDN Magazine Web 站點上的下載中的 ManagedExceptionQueue.cpp 中。
返回頁首
異常日志記錄線程
文章來源于領測軟件測試網 http://www.kjueaiud.com/