2014-07-12 97 views
5

我讀了一些關於窗口線程池的片段。它看起來像CLR線程池。windows線程池和CLR線程池有什麼區別

CLR基於Windows,所以CLR線程基於windows線程池,是不是?

我知道每個.net進程都有一個線程池,windows線程池中的情況如何?操作系統有一個或多個線程池?

在C#中,開發人員可以通過代碼控制窗口線程池嗎?

+3

當您詢問您閱讀的內容時,請添加一個鏈接(或至少一個發佈名稱)。 –

回答

13

這是CLR實施問題之一,沒有一個直接的答案。確定ThreadPool的實現方式不取決於CLR。這是CLR主機的工作。一層將CLR與操作系統集成的軟件。 CLR用來完成線程池事情的核心接口是IHostThreadPoolManager。它是一個非託管的COM接口,但您在識別與ThreadPool類成員幾乎一對一的映射時幾乎沒有任何問題。

還有許多 CLR主機的實現。更可識別的是用於桌面應用程序的默認CLR主機,由mscoree.dll實現。它有不同版本的Windows版本。還有ASP.NET,Sql Server,Visual Studio Hosting進程,Silverlight的自定義主機,Windows Phone,XBox。而不那麼可識別的,大型非託管應用程序可以自己託管CLR,以支持使用.NET語言實現的腳本。 AutoCAD等CAD程序是標準示例。

線程的核心概念是在CLR中虛擬化的。 IClrTask和IClrTaskManager是它的主機接口。它允許主機在除操作系統線程以外的其他東西上實現線程。像纖維一樣。沒有人真的這樣做順便說一句。

當然,Windows有一個線程池自己的api。 winapi函數CreateThreadPool()可以讓球滾動。但是,在我的機器上用dumpbin.exe/imports打開mscor * .dll文件,我沒有看到它被使用。至少部分問題可能是CreateThreadPool()是一個後來的winapi函數,只有在Vista以後纔可用。 XP和更早的Windows版本有一個更簡單的實現。所以,不,至少對於.NET 4.5.2的桌面版本來說,Windows線程池似乎並不相關。