Freigeben über


Laufzeitkonfigurationsoptionen für Threading

In diesem Artikel werden die Einstellungen beschrieben, die Sie zum Konfigurieren von Threading in .NET verwenden können.

Verwenden aller CPU-Gruppen unter Windows

  • Auf Computern mit mehreren CPU-Gruppen konfiguriert diese Einstellung, ob Komponenten wie der Threadpool alle CPU-Gruppen oder nur die primäre CPU-Gruppe des Prozesses verwenden. Die Einstellung wirkt sich auch auf die Environment.ProcessorCount Rückgabe aus.
  • Wenn diese Einstellung aktiviert ist, werden alle CPU-Gruppen verwendet, und Threads werden standardmäßig auch automatisch über CPU-Gruppen verteilt .
  • Diese Einstellung ist standardmäßig unter Windows 11 und höheren Versionen aktiviert und standardmäßig unter Windows 10 und früheren Versionen deaktiviert. Damit diese Einstellung wirksam wird, wenn sie aktiviert ist, muss die GC auch so konfiguriert sein, dass alle CPU-Gruppen verwendet werden. weitere Informationen finden Sie unter GC CPU-Gruppen.
Einstellungsname Werte
runtimeconfig.json N/A N/A
Umgebungsvariable DOTNET_Thread_UseAllCpuGroups 0 – deaktiviert
1 – aktiviert

Zuweisen von Threads zu CPU-Gruppen unter Windows

  • Auf Computern mit mehreren CPU-Gruppen und allen CPU-Gruppen wird mit dieser Einstellung konfiguriert, ob Threads automatisch über CPU-Gruppen verteilt werden.
  • Wenn diese Einstellung aktiviert ist, werden einer CPU-Gruppe neue Threads auf eine Weise zugewiesen, die versucht, eine bereits verwendete CPU-Gruppe vollständig aufzufüllen, bevor sie eine neue CPU-Gruppe verwendet.
  • Diese Einstellung ist standardmäßig aktiviert.
Einstellungsname Werte
runtimeconfig.json N/A N/A
Umgebungsvariable DOTNET_Thread_AssignCpuGroups 0 – deaktiviert
1 – aktiviert

Mindestthreads

Einstellungsname Werte
runtimeconfig.json System.Threading.ThreadPool.MinThreads Eine ganze Zahl, die die Mindestanzahl von Threads darstellt
MSBuild-Eigenschaft ThreadPoolMinThreads Eine ganze Zahl, die die Mindestanzahl von Threads darstellt
Umgebungsvariable N/A N/A

Examples

runtimeconfig.json-Datei:

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

runtimeconfig.template.json-Datei:

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

Projektdatei:

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

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

</Project>

Maximale Threads

Einstellungsname Werte
runtimeconfig.json System.Threading.ThreadPool.MaxThreads Eine ganze Zahl, die die maximale Anzahl von Threads darstellt
MSBuild-Eigenschaft ThreadPoolMaxThreads Eine ganze Zahl, die die maximale Anzahl von Threads darstellt
Umgebungsvariable N/A N/A

Examples

runtimeconfig.json-Datei:

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

runtimeconfig.template.json-Datei:

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

Projektdatei:

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

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

</Project>

Windows-Threadpool

  • Bei Projekten unter Windows wird konfiguriert, ob die Threadpoolthreadverwaltung an den Windows-Threadpool delegiert wird.
  • Wenn Sie diese Einstellung weglassen oder die Plattform nicht Windows ist, wird stattdessen der .NET-Threadpool verwendet.
  • Nur anwendungen, die mit nativem AOT unter Windows veröffentlicht wurden, verwenden standardmäßig den Windows-Threadpool, für den Sie stattdessen den .NET-Threadpool verwenden können, indem Sie die Konfigurationseinstellung deaktivieren.
  • Der Windows-Threadpool kann in einigen Fällen besser ausgeführt werden, z. B. in Fällen, in denen die Mindestanzahl von Threads auf einen hohen Wert konfiguriert ist, oder wenn der Windows-Threadpool bereits stark von der App verwendet wird. Es kann auch Fälle geben, in denen der .NET-Threadpool besser funktioniert, z. B. bei einer hohen E/A-Behandlung auf größeren Computern. Es ist ratsam, Leistungsmetriken beim Ändern dieser Konfigurationseinstellung zu überprüfen.
  • Einige APIs werden nicht unterstützt, wenn Sie den Windows-Threadpool verwenden, z ThreadPool.SetMinThreads. B. , ThreadPool.SetMaxThreadsund ThreadPool.BindHandle(SafeHandle). Threadpoolkonfigurationseinstellungen für minimale und maximale Threads sind ebenfalls nicht effektiv. Eine Alternative zu ThreadPool.BindHandle(SafeHandle) dieser Klasse ist die ThreadPoolBoundHandle Klasse.
Einstellungsname Werte Eingeführt in Version
runtimeconfig.json System.Threading.ThreadPool.UseWindowsThreadPool true – aktiviert
false – deaktiviert
.NET 8
MSBuild-Eigenschaft UseWindowsThreadPool true – aktiviert
false – deaktiviert
.NET 8
Umgebungsvariable DOTNET_ThreadPool_UseWindowsThreadPool 1 – aktiviert
0 – deaktiviert
.NET 8

Examples

runtimeconfig.json-Datei:

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

runtimeconfig.template.json-Datei:

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

Projektdatei:

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

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

</Project>

Threadeinfügung als Reaktion auf das Blockieren von Arbeitsaufgaben

In einigen Fällen erkennt der Threadpool Arbeitsaufgaben, die seine Threads blockieren. Um dies zu kompensieren, werden weitere Threads eingefügt. In .NET 6+ können Sie die folgenden Laufzeitkonfigurationseinstellungen verwenden, um die Threadeinfügung als Reaktion auf das Blockieren von Arbeitsaufgaben zu konfigurieren. Derzeit werden diese Einstellungen nur für Arbeitsaufgaben wirksam, die auf den Abschluss einer anderen Aufgabe warten, z. B. in typischen Synchronisierungs-über-asynchronen Fällen.

runtimeconfig.json Einstellungsname Description Eingeführt in Version
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor Nachdem die Threadanzahl erreicht MinThreads wurde, gibt dieser Wert (nach dem Multiplizieren durch die Prozessoranzahl) an, wie viele zusätzliche Threads ohne Verzögerung erstellt werden können. .NET 6
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor Nachdem die Threadanzahl erreicht ThreadsToAddWithoutDelay wurde, gibt dieser Wert (nach dem Multiplizieren durch die Prozessoranzahl) an, wie viele Threads DelayStepMs der Verzögerung hinzugefügt werden, bevor jeder neue Thread erstellt wird. .NET 6
System.Threading.ThreadPool.Blocking.DelayStepMs Nachdem die threadanzahl basierend auf ThreadsToAddWithoutDelay erreicht wurde, gibt dieser Wert an, wie viel zusätzliche Verzögerung pro Threads hinzugefügt ThreadsPerDelayStep werden soll, die vor der Erstellung jedes neuen Threads angewendet werden. .NET 6
System.Threading.ThreadPool.Blocking.MaxDelayMs Nachdem die threadanzahl basierend auf ThreadsToAddWithoutDelay erreicht wurde, gibt dieser Wert die maximale Verzögerung an, die verwendet werden soll, bevor jeder neue Thread erstellt wird. .NET 6
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage Standardmäßig ist die Geschwindigkeit der Threadeinfügung als Reaktion auf die Blockierung durch Heuristiken begrenzt, die bestimmen, ob genügend physischer Arbeitsspeicher verfügbar ist. In manchen Situationen ist es möglicherweise vorzuziehen, Threads auch in Situationen mit geringem Arbeitsspeicher schneller injizieren zu können. Sie können die Heuristiken für die Speicherauslastung deaktivieren, indem Sie diese Option deaktivieren. .NET 7

Wirkung der Konfigurationseinstellungen

  • Nach dem Erreichen der Threadanzahl können MinThreads bis zu ThreadsToAddWithoutDelay zusätzliche Threads ohne Verzögerung erstellt werden.
  • Danach wird vor dem Erstellen jedes zusätzlichen Threads eine Verzögerung ausgelöst, beginnend mit DelayStepMs.
  • Für alle ThreadsPerDelayStep Threads, die mit verzögerungsverzögert hinzugefügt werden, wird der Verzögerung eine zusätzliche DelayStepMs Hinzugefügt.
  • Die Verzögerung darf nicht überschreiten MaxDelayMs.
  • Verzögerungen werden nur vor dem Erstellen von Threads induziert. Wenn Threads bereits verfügbar sind, würden sie unverzüglich freigegeben, um die Sperrung von Arbeitsaufgaben zu kompensieren.
  • Die Nutzung und Grenzen des physischen Arbeitsspeichers werden ebenfalls verwendet, und über einen Schwellenwert hinaus wechselt das System zu langsamerer Threadeinfügung.

Examples

runtimeconfig.json-Datei:

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

runtimeconfig.template.json-Datei:

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

AutoreleasePool für verwaltete Threads

Mit dieser Option wird konfiguriert, ob jeder verwaltete Thread einen impliziten NSAutoreleasePool empfängt, wenn er auf einer unterstützten macOS-Plattform ausgeführt wird.

Einstellungsname Werte Eingeführt in Version
runtimeconfig.json System.Threading.Thread.EnableAutoreleasePool true oder false .NET 6
MSBuild-Eigenschaft AutoreleasePoolSupport true oder false .NET 6
Umgebungsvariable N/A N/A N/A

Examples

runtimeconfig.json-Datei:

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

runtimeconfig.template.json-Datei:

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

Projektdatei:

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

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

</Project>