Dela via


Körningskonfigurationsalternativ för trådning

Den här artikeln beskriver de inställningar som du kan använda för att konfigurera trådning i .NET.

Kommentar

.NET 6 standardiserar på prefixet DOTNET_ i stället COMPlus_ för för miljövariabler som konfigurerar .NET-körningsbeteende. Prefixet COMPlus_ fortsätter dock att fungera. Om du använder en tidigare version av .NET-körningen bör du fortfarande använda prefixet COMPlus_ för miljövariabler.

Använda alla CPU-grupper i Windows

  • På datorer som har flera CPU-grupper konfigurerar den här inställningen om komponenter som trådpoolen använder alla CPU-grupper eller endast processens primära CPU-grupp. Inställningen påverkar också vad som Environment.ProcessorCount returneras.
  • När den här inställningen är aktiverad används alla CPU-grupper och trådar distribueras också automatiskt över CPU-grupper som standard.
  • Den här inställningen är aktiverad som standard i Windows 11 och senare versioner och inaktiveras som standard i Windows 10 och tidigare versioner. För att den här inställningen ska börja gälla när den är aktiverad måste GC också konfigureras för att använda alla CPU-grupper. Mer information finns i GC CPU-grupper.
Inställningsnamn Värden
runtimeconfig.json Saknas Saknas
Miljövariabel COMPlus_Thread_UseAllCpuGroups eller DOTNET_Thread_UseAllCpuGroups 0 -Inaktiverad
1 -Aktiverat

Tilldela trådar till CPU-grupper i Windows

  • På datorer som har flera CPU-grupper och alla CPU-grupper används, konfigurerar den här inställningen om trådar distribueras automatiskt över CPU-grupper.
  • När den här inställningen är aktiverad tilldelas nya trådar till en CPU-grupp på ett sätt som försöker fylla i en processorgrupp som redan används innan en ny processorgrupp används.
  • Den här inställningen är aktiverad som standard.
Inställningsnamn Värden
runtimeconfig.json Saknas Saknas
Miljövariabel COMPlus_Thread_AssignCpuGroups eller DOTNET_Thread_AssignCpuGroups 0 -Inaktiverad
1 -Aktiverat

Minsta antal trådar

Inställningsnamn Värden
runtimeconfig.json System.Threading.ThreadPool.MinThreads Ett heltal som representerar det minsta antalet trådar
MSBuild-egenskap ThreadPoolMinThreads Ett heltal som representerar det minsta antalet trådar
Miljövariabel Saknas Saknas

Exempel

runtimeconfig.json-fil :

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.MinThreads": 4
      }
   }
}

runtimeconfig.template.json-fil :

{
   "configProperties": {
      "System.Threading.ThreadPool.MinThreads": 4
   }
}

Projektfil:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ThreadPoolMinThreads>4</ThreadPoolMinThreads>
  </PropertyGroup>

</Project>

Maximalt antal trådar

Inställningsnamn Värden
runtimeconfig.json System.Threading.ThreadPool.MaxThreads Ett heltal som representerar det maximala antalet trådar
MSBuild-egenskap ThreadPoolMaxThreads Ett heltal som representerar det maximala antalet trådar
Miljövariabel Saknas Saknas

Exempel

runtimeconfig.json-fil :

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.MaxThreads": 20
      }
   }
}

runtimeconfig.template.json-fil :

{
   "configProperties": {
      "System.Threading.ThreadPool.MaxThreads": 20
   }
}

Projektfil:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
  </PropertyGroup>

</Project>

Windows-trådpool

  • För projekt i Windows konfigurerar du om trådpoolens trådhantering delegeras till Windows-trådpoolen.
  • Om du utelämnar den här inställningen eller om plattformen inte är Windows används .NET-trådpoolen i stället.
  • Endast program som publiceras med intern AOT i Windows använder Windows-trådpoolen som standard, för vilka du kan välja att använda .NET-trådpoolen i stället genom att inaktivera konfigurationsinställningen.
  • Windows-trådpoolen kan fungera bättre i vissa fall, till exempel i fall där det minsta antalet trådar är konfigurerat till ett högt värde, eller när Windows-trådpoolen redan används mycket av appen. Det kan också finnas fall där .NET-trådpoolen presterar bättre, till exempel vid tung I/O-hantering på större datorer. Vi rekommenderar att du kontrollerar prestandamått när du ändrar den här konfigurationsinställningen.
  • Vissa API:er stöds inte när du använder Windows-trådpoolen, till exempel ThreadPool.SetMinThreads, ThreadPool.SetMaxThreadsoch ThreadPool.BindHandle(SafeHandle). Konfigurationsinställningar för trådpooler för minsta och högsta antal trådar är inte heller effektiva. Ett alternativ till ThreadPool.BindHandle(SafeHandle) är ThreadPoolBoundHandle klassen.
Inställningsnamn Värden Version introducerad
runtimeconfig.json System.Threading.ThreadPool.UseWindowsThreadPool true -Aktiverat
false -Inaktiverad
.NET 8
MSBuild-egenskap UseWindowsThreadPool true -Aktiverat
false -Inaktiverad
.NET 8
Miljövariabel DOTNET_ThreadPool_UseWindowsThreadPool 1 -Aktiverat
0 -Inaktiverad
.NET 8

Exempel

runtimeconfig.json-fil :

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.UseWindowsThreadPool": true
      }
   }
}

runtimeconfig.template.json-fil :

{
   "configProperties": {
      "System.Threading.ThreadPool.UseWindowsThreadPool": true
   }
}

Projektfil:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <UseWindowsThreadPool>true</UseWindowsThreadPool>
  </PropertyGroup>

</Project>

Trådinmatning som svar på blockering av arbetsobjekt

I vissa fall identifierar trådpoolen arbetsobjekt som blockerar dess trådar. För att kompensera injicerar det fler trådar. I .NET 6+ kan du använda följande inställningar för körningskonfiguration för att konfigurera trådinmatning som svar på blockering av arbetsobjekt. För närvarande börjar de här inställningarna endast gälla för arbetsobjekt som väntar på att en annan uppgift ska slutföras, till exempel i vanliga synkroniserings-över-asynkrona fall.

namn på inställningen runtimeconfig.json beskrivning Version introducerad
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor När antalet trådar som baseras på MinThreads har nåtts anger det här värdet (efter att det multiplicerats med antalet processorer) hur många ytterligare trådar som kan skapas utan fördröjning. .NET 6
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor När antalet trådar som baseras på ThreadsToAddWithoutDelay har nåtts anger det här värdet (efter att det multiplicerats med antalet processorer) efter hur många trådar som ytterligare DelayStepMs skulle läggas till i fördröjningen innan varje ny tråd skapas. .NET 6
System.Threading.ThreadPool.Blocking.DelayStepMs När antalet trådar som baseras på ThreadsToAddWithoutDelay har nåtts anger det här värdet hur mycket ytterligare fördröjning som ska läggas till per ThreadsPerDelayStep trådar, vilket skulle tillämpas innan varje ny tråd skapas. .NET 6
System.Threading.ThreadPool.Blocking.MaxDelayMs När antalet trådar som baseras på ThreadsToAddWithoutDelay har nåtts anger det här värdet den maximala fördröjning som ska användas innan varje ny tråd skapas. .NET 6
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage Som standard begränsas trådinmatningshastigheten som svar på blockering av heuristik som avgör om det finns tillräckligt med fysiskt minne tillgängligt. I vissa situationer kan det vara bättre att mata in trådar snabbare även i situationer med lågt minne. Du kan inaktivera minnesanvändningens heuristik genom att stänga av den här växeln. .NET 7

Så här träder konfigurationsinställningarna i kraft

  • När antalet trådar som baseras på MinThreads har nåtts kan upp till ThreadsToAddWithoutDelay ytterligare trådar skapas utan fördröjning.
  • Därefter, innan varje ytterligare tråd skapas, uppstår en fördröjning som börjar med DelayStepMs.
  • För varje ThreadsPerDelayStep tråd som läggs till med en fördröjning läggs ytterligare DelayStepMs en till i fördröjningen.
  • Fördröjningen får inte överstiga MaxDelayMs.
  • Fördröjningar uppstår bara innan trådar skapas. Om trådar redan är tillgängliga släpps de utan fördröjning för att kompensera för blockering av arbetsobjekt.
  • Användning och gränser för fysiskt minne används också, och utöver ett tröskelvärde växlar systemet till långsammare trådinmatning.

Exempel

runtimeconfig.json-fil :

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
      }
   }
}

runtimeconfig.template.json-fil :

{
   "configProperties": {
      "System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
   }
}

AutoreleasePool för hanterade trådar

Det här alternativet konfigurerar om varje hanterad tråd tar emot en implicit NSAutoreleasePool när den körs på en macOS-plattform som stöds.

Inställningsnamn Värden Version introducerad
runtimeconfig.json System.Threading.Thread.EnableAutoreleasePool true eller false .NET 6
MSBuild-egenskap AutoreleasePoolSupport true eller false .NET 6
Miljövariabel Saknas Saknas Saknas

Exempel

runtimeconfig.json-fil :

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.Thread.EnableAutoreleasePool": true
      }
   }
}

runtimeconfig.template.json-fil :

{
   "configProperties": {
      "System.Threading.Thread.EnableAutoreleasePool": true
   }
}

Projektfil:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <AutoreleasePoolSupport>true</AutoreleasePoolSupport>
  </PropertyGroup>

</Project>