許多應用程式所建立的執行緒把很多的時間花費在休眠狀態,等候著事件發生。也有的執行緒進入休眠狀態後只是定時甦醒,來輪詢變更或更新狀態的資訊。採取執行緒共用的方式,可將系統所管理的背景工作執行緒 (Worker Thread) 集區提供給您的應用程式,讓您的執行緒使用起來更有效率。一個執行緒監視著佇列在執行緒集區的數項等候作業的狀態。當有等候作業完成,執行緒集區的背景工作執行緒會執行對應的回呼函式 (Callback Function)。
注意事項: |
|---|
Managed 執行緒集區中的執行緒為背景執行緒。也就是說,其 IsBackground 屬性為 true。這就表示,在所有前景執行緒都結束後,ThreadPool 執行緒並不會讓應用程式持續執行。 |
您也可以將與等候作業無關的工作項目佇列在執行緒集區。若要要求工作項目由執行緒集區中的執行緒處理,請呼叫 QueueUserWorkItem 方法。這個方法將執行緒集區中選出之執行緒將會呼叫之方法或委派 (Delegate) 的參考當做參數。工作項目進入佇列之後便無法取消。
計時器佇列中的計時器以及已登錄的等候作業也使用執行緒集區。它們的回呼函式佇列在執行緒集區。
每一個處理序都會有一個執行緒集區。執行緒集區的預設大小為每個可用處理器 25 個背景工作執行緒,以及 1000 個 I/O 完成執行緒。您可以使用 SetMaxThreads 方法變更執行緒集區中的執行緒數目。每個執行緒都使用預設的堆疊大小,並且按照預設的優先權來執行。
注意事項: |
|---|
裝載 .NET Framework 的 Unmanaged 程式碼可以使用 mscoree.h 檔中所定義的 CorSetMaxThreads 函式變更執行緒集區的大小。 |
執行緒集區會維持最小閒置執行緒數目。針對背景工作執行緒,這個最小值的預設值為處理序的數目。GetMinThreads 方法會取得閒置背景工作和 I/O 完成執行緒的最小數目。
當所有執行緒集區都已指派至工作時,執行緒集區並不會立即開始建立新的閒置執行緒。為避免不必要地配置執行緒的堆疊空間,它會依照間隔建立新的閒置執行緒。這個間隔目前為半秒,不過在未來的 .NET Framework 版本中可能會變更。
如果應用程式受到突然增加的活動影響 (例如,大量佇列的執行緒集區工作),請使用 SetMinThreads 方法增加最小閒置執行緒的數目。否則,建立新閒置執行緒時的內建延遲可能會造成瓶頸。
注意事項: |
|---|
不必要地增加閒置執行緒的數目也可能會造成效能問題。每個執行緒都必須配置堆疊空間。如果太多工作同時啟動,則所有工作可能都會變慢。找出正確的平衡才是效能調整的關鍵。 |
當執行緒集區重複使用執行緒時,不會清除執行緒區域儲存區或標示 ThreadStaticAttribute 屬性之欄位中的資料。因此,使用一種方法放入執行緒區域儲存區的資料,可能會對相同執行緒集區執行緒所執行的另一種方法公開。根據執行方法的執行緒集區執行緒而定,存取標示 ThreadStaticAttribute 屬性之欄位的方法可能會遇到不同的資料。
自 .NET Framework 2.0 版 Service Pack 1 開始,對於大量使用小型執行緒集區工作的應用程式而言,執行緒集區的處理量已大幅提升。這些應用程式將有以下三方面的改善:佇列工作、分派執行緒集區的執行緒,以及分派 I/O 完成執行緒。若要使用這項功能,您的應用程式應以 .NET Framework 3.5 版為目標。如需詳細資訊,請參閱 .NET Framework 3.5 架構。