2010-05-31 17 views

回答

3

System.Threading.ThreadCurrentThread靜態屬性是當前CLR System.Threading.Thread實例。 CLR線程是對底層win32線程的抽象。 System.Diagnostics.ProcessThread類提供了一個訪問win32線程的權限,主要用於性能跟蹤。

CLR線程的一個關鍵區別是它們不固定到win32線程。

+0

只需添加更多的輸入,以便CLR線程在Windows線程上創建一個抽象層。這個抽象層產生了一些限制,例如,當它實際上存在於Windows線程中時,無法將空閒和時間關鍵的線程優先級分配給CLR線程。 CLR已經爲它自己運行的某些線程保留了這些線程優先級,例如,垃圾收集器的終結器線程按時間關鍵優先級運行。 – RBT 2016-02-10 23:18:44

+0

我沒有得到最後一點CLR線程不固定到win32線程。你的意思是CLR線程可以指向哪些其他可能的線程類型(除了win32類型的線程),或者你談論的是CLR線程和Windows線程之間的基數關係。 AFAIK在CLR線程和Windows線程之間有一對一映射。無論何時在C#中新建線程類時,在幕後它最終只會創建一個Windows線程。兩個CLR線程永遠不能指向相同的win32線程。 – RBT 2016-02-10 23:20:57

13

當設計.NET 2.0時,它是來自SQL Server項目的宿醉。他們迫切需要CLR團隊真的很難打破.NET Thread類和操作系統線程之間的鏈接。他們當時有理由相信,SQL Server支持以光纖實現的「輕量級」線程。光纖是Windows實現的「協同程序」,這在15年前流行起來。

該項目是一個蕭條,他們不能得到足夠的可靠性。可悲的是,我們堅持使用將線程映射到ProcessThread的簡單方法。相當的損失。也許有些人有一天會利用解耦,我還沒有看到它完成。

您現在可用的唯一映射現在是線程本身內的P/Invoke GetCurrentThreadId()。這會返回一個您可以匹配到ProcessThread.Id的TID。