2009-07-26 114 views
0

有沒有辦法,我勾管理線程的出口(即運行一個線程一些代碼,其退出前?)掛鉤線程退出

我已經開發了掛鉤線程退出一個可行的機制爲部分線程。第1步:開發一個'hook'STA COM類,它接受一個回調函數並在析構函數中調用它。第2步:在我想掛鉤的線程上創建一個ThreadStatic實例,並將該對象的託管代理轉換爲非託管函數指針。該代理然後調用線程退出(因爲CLR在所有STA COM RCW上調用IUnknown :: Release作爲線程退出的一部分)。

此機制適用於我使用Thread類在代碼中創建的工作線程。

但是,它似乎不適用於應用程序的主線程(無論是控制檯還是Windows應用程序)。 'hook'COM對象似乎在關閉過程中被刪除的太晚,並且調用委託的嘗試失敗。

(我想實現這個功能的原因是,我可以在退出的線程上運行一些原生COM代碼,該線程與線程上創建的STA COM對象一起工作,在「太遲」之前(即線程之前已退出,並且不再可以在該線程上使用STA COM對象。))

回答

0

您是否控制線程創建?簡單地將線程的代碼包裝在try ... finally子句中,並將代碼放入終端中可能最簡單。

請注意,當AppDomain關閉時,您無法確定您的代碼將被調用,因爲關閉可能不夠優雅。

當你說「析構函數」時,我假定你是指C++/CLI析構函數 - 即.Dispose()方法?

如果您需要支持的進程退出之前掛鉤,你可以試試AppDomain.CurrentDomain.ProcessExit事件 - 這似乎並沒有開槍未處理的異常,或AppDomain.CurrentDomain.UnhandledException這似乎只對未處理的異常火災。

沒有一個看起來特別健壯,不介意你......

+0

第1段:沒有。第2段:是的,但沒問題。第3段:否,本地C++實現的coclass的析構函數。第4段:嗯,我會檢查一下。第5段:儘管如此。 – mackenir 2009-07-26 14:39:31