Delen via


Runtimeconfiguratieopties voor threading

In dit artikel worden de instellingen beschreven die u kunt gebruiken voor het configureren van threading in .NET.

Notitie

.NET 6 standaardiseert het voorvoegsel DOTNET_ in plaats van COMPlus_ voor omgevingsvariabelen die .NET-runtimegedrag configureren. COMPlus_ Het voorvoegsel blijft echter werken. Als u een eerdere versie van de .NET-runtime gebruikt, moet u nog steeds het COMPlus_ voorvoegsel voor omgevingsvariabelen gebruiken.

Alle CPU-groepen gebruiken in Windows

  • Op computers met meerdere CPU-groepen configureert deze instelling of onderdelen zoals de threadgroep alle CPU-groepen of alleen de primaire CPU-groep van het proces gebruiken. De instelling is ook van invloed op wat Environment.ProcessorCount er wordt geretourneerd.
  • Wanneer deze instelling is ingeschakeld, worden alle CPU-groepen gebruikt en worden threads standaard ook automatisch verdeeld over CPU-groepen .
  • Deze instelling is standaard ingeschakeld voor Windows 11 en latere versies en is standaard uitgeschakeld in Windows 10 en eerdere versies. Als deze instelling van kracht wordt wanneer ingeschakeld, moet de GC ook worden geconfigureerd voor het gebruik van alle CPU-groepen; Zie GC CPU-groepen voor meer informatie.
Naam instelling Waarden
runtimeconfig.json N.v.t. N.v.t.
Omgevingsvariabele COMPlus_Thread_UseAllCpuGroups of DOTNET_Thread_UseAllCpuGroups 0 -Handicap
1 -Ingeschakeld

Threads toewijzen aan CPU-groepen in Windows

  • Op computers met meerdere CPU-groepen en alle CPU-groepen worden gebruikt, wordt met deze instelling geconfigureerd of threads automatisch worden verdeeld over CPU-groepen.
  • Wanneer deze instelling is ingeschakeld, worden nieuwe threads toegewezen aan een CPU-groep op een manier die probeert een CPU-groep die al wordt gebruikt, volledig te vullen voordat een nieuwe CPU-groep wordt gebruikt.
  • Deze instelling is standaard ingeschakeld.
Naam instelling Waarden
runtimeconfig.json N.v.t. N.v.t.
Omgevingsvariabele COMPlus_Thread_AssignCpuGroups of DOTNET_Thread_AssignCpuGroups 0 -Handicap
1 -Ingeschakeld

Minimale threads

  • Hiermee geeft u het minimum aantal threads voor de werkrolthreadgroep op.
  • Komt overeen met de ThreadPool.SetMinThreads methode.
Naam instelling Waarden
runtimeconfig.json System.Threading.ThreadPool.MinThreads Een geheel getal dat het minimale aantal threads aangeeft
MSBuild-eigenschap ThreadPoolMinThreads Een geheel getal dat het minimale aantal threads aangeeft
Omgevingsvariabele N.v.t. N.v.t.

Voorbeelden

runtimeconfig.json-bestand :

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

runtimeconfig.template.json-bestand :

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

Projectbestand:

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

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

</Project>

Maximum aantal threads

  • Hiermee geeft u het maximum aantal threads voor de werkrolthreadgroep op.
  • Komt overeen met de ThreadPool.SetMaxThreads methode.
Naam instelling Waarden
runtimeconfig.json System.Threading.ThreadPool.MaxThreads Een geheel getal dat het maximum aantal threads aangeeft
MSBuild-eigenschap ThreadPoolMaxThreads Een geheel getal dat het maximum aantal threads aangeeft
Omgevingsvariabele N.v.t. N.v.t.

Voorbeelden

runtimeconfig.json-bestand :

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

runtimeconfig.template.json-bestand :

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

Projectbestand:

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

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

</Project>

Windows-threadgroep

  • Voor projecten in Windows configureert u of threadgroepbeheer is gedelegeerd aan de Windows-threadgroep.
  • Als u deze instelling weglaat of het platform geen Windows is, wordt in plaats daarvan de .NET-threadgroep gebruikt.
  • Alleen toepassingen die zijn gepubliceerd met Systeemeigen AOT in Windows, gebruiken standaard de Windows-threadgroep, waarvoor u ervoor kunt kiezen om in plaats daarvan de .NET-threadgroep te gebruiken door de configuratie-instelling uit te schakelen.
  • De Windows-threadgroep kan in sommige gevallen beter presteren, zoals in gevallen waarin het minimum aantal threads is geconfigureerd voor een hoge waarde of wanneer de Windows-threadgroep al intensief wordt gebruikt door de app. Er kunnen zich ook gevallen voordoen waarbij de .NET-threadpool beter presteert, zoals bij zware I/O-verwerking op grotere machines. Het is raadzaam om prestatiegegevens te controleren bij het wijzigen van deze configuratie-instelling.
  • Sommige API's worden niet ondersteund bij het gebruik van de Windows-threadgroep, zoals ThreadPool.SetMinThreads, ThreadPool.SetMaxThreadsen ThreadPool.BindHandle(SafeHandle). Configuratie-instellingen voor threadgroepen voor minimum- en maximumthreads zijn ook niet effectief. Een alternatief voor ThreadPool.BindHandle(SafeHandle) de ThreadPoolBoundHandle klas.
Naam instelling Waarden Versie geïntroduceerd
runtimeconfig.json System.Threading.ThreadPool.UseWindowsThreadPool true -Ingeschakeld
false -Handicap
.NET 8
MSBuild-eigenschap UseWindowsThreadPool true -Ingeschakeld
false -Handicap
.NET 8
Omgevingsvariabele DOTNET_ThreadPool_UseWindowsThreadPool 1 -Ingeschakeld
0 -Handicap
.NET 8

Voorbeelden

runtimeconfig.json-bestand :

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

runtimeconfig.template.json-bestand :

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

Projectbestand:

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

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

</Project>

Threadinjectie als reactie op blokkerende werkitems

In sommige gevallen detecteert de threadgroep werkitems die de threads blokkeren. Ter compensatie injecteert het meer threads. In .NET 6+ kunt u de volgende runtimeconfiguratie-instellingen gebruiken om threadinjectie te configureren als reactie op het blokkeren van werkitems. Deze instellingen worden momenteel alleen van kracht voor werkitems die wachten tot een andere taak is voltooid, zoals in typische synchronisatie-over-asynchrone gevallen.

naam van runtimeconfig.json-instelling Beschrijving Versie geïntroduceerd
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor Nadat het aantal threads op basis van MinThreads is bereikt, geeft deze waarde (nadat deze is vermenigvuldigd met het aantal processoren) aan hoeveel extra threads zonder vertraging kunnen worden gemaakt. .NET 6
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor Nadat het aantal threads is bereikt op ThreadsToAddWithoutDelay basis van het aantal threads, geeft deze waarde (nadat deze is vermenigvuldigd met het aantal processoren) aan hoeveel threads een extra DelayStepMs aan de vertraging wordt toegevoegd voordat elke nieuwe thread wordt gemaakt. .NET 6
System.Threading.ThreadPool.Blocking.DelayStepMs Nadat het aantal threads op basis van ThreadsToAddWithoutDelay is bereikt, geeft deze waarde aan hoeveel extra vertraging per ThreadsPerDelayStep thread moet worden toegevoegd, die wordt toegepast voordat elke nieuwe thread wordt gemaakt. .NET 6
System.Threading.ThreadPool.Blocking.MaxDelayMs Nadat het aantal threads op basis van ThreadsToAddWithoutDelay is bereikt, geeft deze waarde de maximale vertraging op die moet worden gebruikt voordat elke nieuwe thread wordt gemaakt. .NET 6
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage Standaard wordt de snelheid van threadinjectie als reactie op blokkeren beperkt door heuristieken die bepalen of er voldoende fysiek geheugen beschikbaar is. In sommige situaties is het misschien beter om threads sneller te injecteren, zelfs in situaties met weinig geheugen. U kunt de heuristiek van het geheugengebruik uitschakelen door deze schakelaar uit te schakelen. .NET 7

Hoe de configuratie-instellingen van kracht worden

  • Nadat het aantal threads op basis van MinThreads is bereikt, kunnen maximaal ThreadsToAddWithoutDelay extra threads zonder vertraging worden gemaakt.
  • Daarna wordt, voordat elke extra thread wordt gemaakt, een vertraging geïnduceerd, beginnend met DelayStepMs.
  • Voor elke ThreadsPerDelayStep thread die met een vertraging wordt toegevoegd, wordt er een extra DelayStepMs toegevoegd aan de vertraging.
  • De vertraging mag niet groter zijn dan MaxDelayMs.
  • Vertragingen worden alleen veroorzaakt voordat u threads maakt. Als threads al beschikbaar zijn, worden ze zonder vertraging vrijgegeven om werkitems te compenseren.
  • Het fysieke geheugengebruik en de limieten worden ook gebruikt en, buiten een drempelwaarde, schakelt het systeem over naar tragere threadinjectie.

Voorbeelden

runtimeconfig.json-bestand :

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

runtimeconfig.template.json-bestand :

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

AutoreleasePool voor beheerde threads

Met deze optie configureert u of elke beheerde thread een impliciete NSAutoreleasePool ontvangt wanneer deze wordt uitgevoerd op een ondersteund macOS-platform.

Naam instelling Waarden Versie geïntroduceerd
runtimeconfig.json System.Threading.Thread.EnableAutoreleasePool true of false .NET 6
MSBuild-eigenschap AutoreleasePoolSupport true of false .NET 6
Omgevingsvariabele N.v.t. N.v.t. N.v.t.

Voorbeelden

runtimeconfig.json-bestand :

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

runtimeconfig.template.json-bestand :

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

Projectbestand:

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

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

</Project>