本文詳細說明了你可以用來設定 .NET 執行緒的設定。
在 Windows 上使用所有 CPU 群組
- 在擁有多個 CPU 群組的機器上,此設定會設定元件如執行緒池是使用所有 CPU 群組,還是僅使用程序的主要 CPU 群組。 設定也會影響回來的內容 Environment.ProcessorCount 。
- 啟用此設定時,所有 CPU 群組都會被使用,執行緒也會 自動分配到不同 CPU 群組 。
- 此設定在 Windows 11 及更新版本預設啟用,Windows 10 及更早版本則預設關閉。 此設定啟用時生效,GC 也必須設定為使用所有 CPU 群組;欲了解更多資訊,請參閱 GC CPU 群組。
| 設定名稱 | 價值觀 | |
|---|---|---|
| runtimeconfig.json | N/A | N/A |
| 環境變數 | DOTNET_Thread_UseAllCpuGroups |
0 - 已停用1 - 已啟用 |
在 Windows 上將執行緒指派給 CPU 群組
- 在擁有多個 CPU 群組且 所有 CPU 群組都被使用時,此設定會設定執行緒是否自動分配到不同 CPU 群組。
- 啟用此設定後,會將新執行緒分配給 CPU 群組,嘗試在使用新 CPU 群組前,先完整填充已使用中的 CPU 群組。
- 此設定預設為啟用狀態。
| 設定名稱 | 價值觀 | |
|---|---|---|
| runtimeconfig.json | N/A | N/A |
| 環境變數 | DOTNET_Thread_AssignCpuGroups |
0 - 已停用1 - 已啟用 |
最小執行緒
- 指定工作執行緒池的最小執行緒數。
- 對應於方法 ThreadPool.SetMinThreads 。
| 設定名稱 | 價值觀 | |
|---|---|---|
| runtimeconfig.json | System.Threading.ThreadPool.MinThreads |
一個整數代表執行緒數量最小 |
| MSBuild 屬性 | ThreadPoolMinThreads |
一個整數代表執行緒數量最小 |
| 環境變數 | N/A | N/A |
範例
runtimeconfig.json 檔案:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
}
runtimeconfig.template.json 檔案:
{
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
專案檔:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMinThreads>4</ThreadPoolMinThreads>
</PropertyGroup>
</Project>
最大執行緒
- 指定工作執行緒池的最大執行緒數量。
- 對應於方法 ThreadPool.SetMaxThreads 。
| 設定名稱 | 價值觀 | |
|---|---|---|
| runtimeconfig.json | System.Threading.ThreadPool.MaxThreads |
一個整數代表最大執行緒數 |
| MSBuild 屬性 | ThreadPoolMaxThreads |
一個整數代表最大執行緒數 |
| 環境變數 | N/A | N/A |
範例
runtimeconfig.json 檔案:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
}
runtimeconfig.template.json 檔案:
{
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
專案檔:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
</PropertyGroup>
</Project>
Windows 執行緒池
- 對於 Windows 專案,設定執行緒池的執行緒管理是否委託給 Windows 執行緒池。
- 如果你省略了這個設定或平台不是 Windows,則會使用 .NET 執行緒池。
- 只有在 Windows 上以 Native AOT 發佈的應用程式才會預設使用 Windows 執行緒池,對於此,你可以選擇停用設定設定來使用 .NET 執行緒池。
- 在某些情況下,Windows 執行緒池的效能可能更好,例如當最低執行緒數設定為高值,或當 Windows 執行緒池已被應用程式大量使用時。 有時 .NET 執行緒池的表現也會更好,例如在大型機器上處理大量 I/O 時。 建議在更改設定時檢查效能指標。
- 使用 Windows 執行緒池時不支援某些 API,例如 ThreadPool.SetMinThreads、 ThreadPool.SetMaxThreads和 ThreadPool.BindHandle(SafeHandle)。 執行緒池中最小與最大執行緒的設定也無效。 另一個替代方案 ThreadPool.BindHandle(SafeHandle) 是 class ThreadPoolBoundHandle 這個。
| 設定名稱 | 價值觀 | 推出的版本 | |
|---|---|---|---|
| runtimeconfig.json | System.Threading.ThreadPool.UseWindowsThreadPool |
true - 已啟用false - 已停用 |
.NET 8 |
| MSBuild 屬性 | UseWindowsThreadPool |
true - 已啟用false - 已停用 |
.NET 8 |
| 環境變數 | DOTNET_ThreadPool_UseWindowsThreadPool |
1 - 已啟用0 - 已停用 |
.NET 8 |
範例
runtimeconfig.json 檔案:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
}
runtimeconfig.template.json 檔案:
{
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
專案檔:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<UseWindowsThreadPool>true</UseWindowsThreadPool>
</PropertyGroup>
</Project>
針對阻塞工作項目的執行緒注入
在某些情況下,執行緒池會偵測到阻擋其執行緒的工作項目。 為了補償,它注入更多線程。 在 .NET 6+ 中,您可以使用以下 執行時設定 來設定針對阻塞工作項目進行執行緒注入。 目前,這些設定僅適用於等待其他任務完成的工作項目,例如典型的 同步非同步 情況。
| runtimeconfig.json 設定名稱 | Description | 推出的版本 |
|---|---|---|
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor |
當 達到執行 MinThreads 緒計數後,這個值(乘以處理器計數後)決定可建立多少額外執行緒而不延遲。 |
.NET 6 |
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor |
當達到基於 的 ThreadsToAddWithoutDelay 執行緒計數後,這個值(乘以處理器計數後)會指定在建立新執行緒前,延遲會增加多少執行緒 DelayStepMs 。 |
.NET 6 |
System.Threading.ThreadPool.Blocking.DelayStepMs |
當以 為基礎 ThreadsToAddWithoutDelay 的執行緒計數達到後,這個值會指定每個 ThreadsPerDelayStep 執行緒要增加多少額外延遲,這些延遲會在每個新執行緒建立前施加。 |
.NET 6 |
System.Threading.ThreadPool.Blocking.MaxDelayMs |
當 的執行緒數量 ThreadsToAddWithoutDelay 達到後,這個值會指定每個新執行緒建立前的最大延遲。 |
.NET 6 |
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage |
預設情況下,針對阻塞的執行緒注入速率受限於判斷是否有足夠實體記憶體的啟發式方法。 在某些情況下,即使在記憶體不足的情況下,更快注入執行緒可能更為理想。 你可以關閉這個開關來關閉記憶體使用啟發式。 | .NET 7 |
設定設定的效果
- 當基於 的
MinThreads執行緒數量達到後,ThreadsToAddWithoutDelay最多可無延遲地建立更多執行緒。 - 之後,在每建立一個額外執行緒之前,會誘發一個延遲
DelayStepMs,從 開始。 - 每
ThreadsPerDelayStep新增一個帶有延遲的執行緒,就會在延遲上加一個額外的DelayStepMs執行緒。 - 延遲不得超過
MaxDelayMs。 - 延遲只會在建立執行緒前被誘導。 如果已有執行緒,將會立即發布,以補償阻塞的工作項目。
- 同時也會考慮實體記憶體使用量與限制,超過閾值後,系統會切換到較慢的執行緒注入。
範例
runtimeconfig.json 檔案:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
}
runtimeconfig.template.json 檔案:
{
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
AutoreleasePool 對於受管理執行緒
此選項會設定每個受管理執行緒在支援的 macOS 平台上運行時,是否會接收隱含的 NSAutoreleasePool 。
| 設定名稱 | 價值觀 | 推出的版本 | |
|---|---|---|---|
| runtimeconfig.json | System.Threading.Thread.EnableAutoreleasePool |
true 或 false |
.NET 6 |
| MSBuild 屬性 | AutoreleasePoolSupport |
true 或 false |
.NET 6 |
| 環境變數 | N/A | N/A | N/A |
範例
runtimeconfig.json 檔案:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
}
runtimeconfig.template.json 檔案:
{
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
專案檔:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AutoreleasePoolSupport>true</AutoreleasePoolSupport>
</PropertyGroup>
</Project>