2011-04-11 74 views
4

閱讀VS2008幫助文件我發現退出線程(在.net中)的乾淨方式是使用return語句(使用C#)或讓線程到達方法的末尾。C#&.net中ExitThread(ExitCode)和GetExitCodeThread的等效參數是什麼?

但是,我還沒有找到一個方法或屬性,可以讓我設置線程的退出代碼,也沒有一種方法來檢索它(因爲它是使用Win32 API完成的)。因此,問題是,如何使用C#和.net來執行此操作?

謝謝你的幫助,

約翰。

回答

7

底層Win32線程原語未公開的原因是爲了防止託管代碼依賴它們。 CLR團隊一直致力於優化線程使用的方法,並且不包括有關1:1託管:非託管線程映射的保證(請參閱this MSDN page上的「注意」部分)。如果你真的想要這樣做,你需要設置P/Invoke包裝器,它使用Win32 GetCurrentThread()中的非託管線程句柄,或者使用自定義主機自己掛接到線程映射過程。我也不會推薦,除非你絕對必須與使用線程退出代碼的東西進行互操作,並且不能管理代碼感知。找出另一種走私狀態信息的方法,如果你可以全部管理它(或使用Task Parallel Library從裸線上提取一個級別)。

+0

nitzmahone,謝謝你的回覆和鏈接。鑑於託管線程和O/S線程之間沒有1:1的對應關係,我認爲Pinvoking ExitThread和GetExitCodeThread不會是可靠的解決方案。我正在考慮從Thread中派生一個新的線程類,它添加一個退出代碼以及適當的方法來設置它並檢索它。我擔心的是,由於在線程終止後檢索退出代碼,GC可能在檢索退出代碼之前處理了線程對象。有沒有辦法保證不會發生? – Hex440bx 2011-04-12 13:05:37

+0

我懷疑你會在那裏得到好的結果 - 線程是密封的,並有充分的理由。如果你正在考慮構建一些不使用Win32退出代碼機制的東西,爲什麼不使用已經存在的更高層次的結構來跟蹤邏輯線程狀態(前面提到的TPL等)呢?或者,您可以像管理線程ID和「退出代碼」的靜態字典一樣簡單 - 保證按照您的需要生活。不知道你的項目的所有細節,但它聽起來像你試圖讓生活比它需要更難... – nitzmahone 2011-04-12 18:04:45

+0

真正的問題是,我只是學習.NET和C#。我對純Windows API非常瞭解,因此,我嘗試將我所瞭解的使用WinAPI進行匹配以在.net和C#中執行相同的操作。顯然,這種方法有其「問題」,但通常很好。在這種情況下,這聽起來像我只需要學習更多的東西來弄清楚如何以.net的方式進行操作。感謝您的幫助和建議。約翰。 – Hex440bx 2011-04-12 22:21:37

相關問題