İş parçacığı oluşturma için çalışma zamanı yapılandırma seçenekleri

Bu makalede, .NET'te iş parçacığını yapılandırmak için kullanabileceğiniz ayarlar ayrıntılı olarak anlatılır.

Dekont

.NET 6, .NET çalışma zamanı davranışını yapılandıran ortam değişkenleri yerine COMPlus_ ön eki DOTNET_ standartlaştırır. Ancak ön COMPlus_ ek çalışmaya devam eder. .NET çalışma zamanının önceki bir sürümünü kullanıyorsanız, ortam değişkenleri için ön eki kullanmaya COMPlus_ devam etmelisiniz.

Windows'ta tüm CPU gruplarını kullanma

  • Birden çok CPU grubuna sahip makinelerde bu ayar, iş parçacığı havuzu gibi bileşenlerin tüm CPU gruplarını mı yoksa işlemin yalnızca birincil CPU grubunu mu kullandığını yapılandırılır. Bu ayar, döndürenleri Environment.ProcessorCount de etkiler.
  • Bu ayar etkinleştirildiğinde tüm CPU grupları kullanılır ve iş parçacıkları da varsayılan olarak CPU grupları arasında otomatik olarak dağıtılır.
  • Bu ayar Windows 11 ve sonraki sürümlerde varsayılan olarak etkinleştirilir ve Windows 10 ve önceki sürümlerde varsayılan olarak devre dışı bırakılır. Bu ayarın etkinleştirildiğinde etkili olması için GC'nin de tüm CPU gruplarını kullanacak şekilde yapılandırılması gerekir; daha fazla bilgi için bkz . GC CPU grupları.
Ayar adı Değerler
runtimeconfig.json Geçersiz Geçersiz
Ortam değişkeni COMPlus_Thread_UseAllCpuGroups veya DOTNET_Thread_UseAllCpuGroups 0 -Devre dışı
1 -Etkin

Windows'ta CPU gruplarına iş parçacığı atama

  • Birden çok CPU grubuna ve tüm CPU gruplarına sahip makinelerde bu ayar, iş parçacıklarının CPU grupları arasında otomatik olarak dağıtılıp dağıtılmayacağını yapılandırılır.
  • Bu ayar etkinleştirildiğinde, yeni iş parçacıkları yeni bir CPU grubu kullanılmadan önce zaten kullanımda olan bir CPU grubunu tam olarak doldurmaya çalışacak şekilde bir CPU grubuna atanır.
  • Bu ayar varsayılan olarak etkindir.
Ayar adı Değerler
runtimeconfig.json Geçersiz Geçersiz
Ortam değişkeni COMPlus_Thread_AssignCpuGroups veya DOTNET_Thread_AssignCpuGroups 0 -Devre dışı
1 -Etkin

Minimum iş parçacıkları

  • Çalışan iş parçacığı havuzu için en az iş parçacığı sayısını belirtir.
  • yöntemine ThreadPool.SetMinThreads karşılık gelir.
Ayar adı Değerler
runtimeconfig.json System.Threading.ThreadPool.MinThreads En az iş parçacığı sayısını temsil eden bir tamsayı
MSBuild özelliği ThreadPoolMinThreads En az iş parçacığı sayısını temsil eden bir tamsayı
Ortam değişkeni Geçersiz Geçersiz

Örnekler

runtimeconfig.json dosyası:

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

runtimeconfig.template.json dosyası:

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

Proje dosyası:

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

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

</Project>

En fazla iş parçacığı sayısı

  • Çalışan iş parçacığı havuzu için en fazla iş parçacığı sayısını belirtir.
  • yöntemine ThreadPool.SetMaxThreads karşılık gelir.
Ayar adı Değerler
runtimeconfig.json System.Threading.ThreadPool.MaxThreads İş parçacığı sayısı üst sınırını temsil eden bir tamsayı
MSBuild özelliği ThreadPoolMaxThreads İş parçacığı sayısı üst sınırını temsil eden bir tamsayı
Ortam değişkeni Geçersiz Geçersiz

Örnekler

runtimeconfig.json dosyası:

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

runtimeconfig.template.json dosyası:

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

Proje dosyası:

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

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

</Project>

Windows iş parçacığı havuzu

  • Windows'da projeler için, iş parçacığı havuzu iş parçacığı yönetiminin Windows iş parçacığı havuzuna temsilci olarak atanıp atanmayacağını yapılandırılır.
  • Bu ayarı atlarsanız veya platform Windows değilse, bunun yerine .NET iş parçacığı havuzu kullanılır.
  • Yalnızca Windows'da Yerel AOT ile yayımlanan uygulamalar varsayılan olarak Windows iş parçacığı havuzunu kullanır. Yapılandırma ayarını devre dışı bırakarak bunun yerine .NET iş parçacığı havuzunu kullanmayı tercih edebilirsiniz.
  • Windows iş parçacığı havuzu, en az iş parçacığı sayısının yüksek bir değere yapılandırıldığı veya Windows iş parçacığı havuzunun uygulama tarafından zaten yoğun olarak kullanıldığı durumlarda daha iyi performans gösterebilir. .NET iş parçacığı havuzunun daha büyük makinelerde ağır G/Ç işleme gibi daha iyi performans gösterdiği durumlar da olabilir. Bu yapılandırma ayarını değiştirirken performans ölçümlerini denetlemesi önerilir.
  • Windows iş parçacığı havuzu kullanılırken , ThreadPool.SetMaxThreadsve ThreadPool.BindHandle(SafeHandle)gibi ThreadPool.SetMinThreadsbazı API'ler desteklenmez. En düşük ve en yüksek iş parçacıkları için iş parçacığı havuzu yapılandırma ayarları da etkili değildir. bunun alternatifi ThreadPool.BindHandle(SafeHandle)ThreadPoolBoundHandle sınıfıdır.
Ayar adı Değerler Sürüm kullanıma sunulmuştur
runtimeconfig.json System.Threading.ThreadPool.UseWindowsThreadPool true -Etkin
false -Devre dışı
.NET 8
MSBuild özelliği UseWindowsThreadPool true -Etkin
false -Devre dışı
.NET 8
Ortam değişkeni DOTNET_ThreadPool_UseWindowsThreadPool 1 -Etkin
0 -Devre dışı
.NET 8

Örnekler

runtimeconfig.json dosyası:

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

runtimeconfig.template.json dosyası:

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

Proje dosyası:

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

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

</Project>

İş öğelerini engellemeye yanıt olarak iş parçacığı ekleme

Bazı durumlarda, iş parçacığı havuzu iş parçacıklarını engelleyen iş öğelerini algılar. Telafi etmek için daha fazla iş parçacığı ekler. .NET 6+'da, iş öğelerini engellemeye yanıt olarak iş parçacığı eklemeyi yapılandırmak için aşağıdaki çalışma zamanı yapılandırma ayarlarını kullanabilirsiniz. Şu anda, bu ayarlar yalnızca başka bir görevin tamamlanmasını bekleyen iş öğeleri için (örneğin, zaman uyumsuz eşitleme durumlarında) etkili olur.

runtimeconfig.json ayar adı Tanım Sürüm kullanıma sunulmuştur
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor temel alınan MinThreads iş parçacığı sayısına ulaşıldıktan sonra bu değer (işlemci sayısıyla çarpıldıktan sonra) gecikme olmadan kaç ek iş parçacığı oluşturulabileceğini belirtir. .NET 6
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor temel alınan ThreadsToAddWithoutDelay iş parçacığı sayısına ulaşıldıktan sonra, bu değer (işlemci sayısıyla çarpıldıktan sonra) her yeni iş parçacığı oluşturulmadan önce gecikmeye kaç iş parçacığı DelayStepMs ekleneceğini belirtir. .NET 6
System.Threading.ThreadPool.Blocking.DelayStepMs temel alan ThreadsToAddWithoutDelay iş parçacığı sayısına ulaşıldıktan sonra bu değer, her yeni iş parçacığı oluşturulmadan önce uygulanacak olan iş parçacıkları başına ThreadsPerDelayStep ne kadar ek gecikme ekleneceğini belirtir. .NET 6
System.Threading.ThreadPool.Blocking.MaxDelayMs temel alan ThreadsToAddWithoutDelay iş parçacığı sayısına ulaşıldıktan sonra, bu değer her yeni iş parçacığı oluşturulmadan önce kullanılacak en uzun gecikmeyi belirtir. .NET 6
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage Varsayılan olarak, engellemeye yanıt olarak iş parçacığı ekleme hızı, kullanılabilir yeterli fiziksel bellek olup olmadığını belirleyen buluşsal yöntemlerle sınırlıdır. Bazı durumlarda, düşük bellekli durumlarda bile iş parçacıklarını daha hızlı bir şekilde eklemek tercih edilebilir. Bu anahtarı kapatarak bellek kullanımı buluşsal özelliklerini devre dışı bırakabilirsiniz. .NET 7

Yapılandırma ayarları nasıl geçerlilik kazanır?

  • temel alan MinThreads iş parçacığı sayısına ulaşıldıktan sonra, gecikme olmadan en fazla ThreadsToAddWithoutDelay ek iş parçacığı oluşturulabilir.
  • Bundan sonra, her ek iş parçacığı oluşturulmadan önce ile başlayan DelayStepMsbir gecikme oluşur.
  • Gecikmeli olarak eklenen her ThreadsPerDelayStep iş parçacığı için gecikmeye bir ek DelayStepMs eklenir.
  • Gecikme aşılamayabilir MaxDelayMs.
  • Gecikmeler yalnızca iş parçacıkları oluşturulmadan önce oluşturulur. İş parçacıkları zaten kullanılabilir durumdaysa, iş öğelerini engellemeyi telafi etmek için gecikme olmadan serbest bırakılırlar.
  • Fiziksel bellek kullanımı ve sınırları da kullanılır ve bir eşiğin ötesinde sistem daha yavaş iş parçacığı eklemeye geçer.

Örnekler

runtimeconfig.json dosyası:

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

runtimeconfig.template.json dosyası:

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

AutoreleasePool yönetilen iş parçacıkları için

Bu seçenek, desteklenen bir macOS platformunda çalıştırılırken her yönetilen iş parçacığının örtük bir NSAutoreleasePool alıp almayacağını yapılandırıyor.

Ayar adı Değerler Sürüm kullanıma sunulmuştur
runtimeconfig.json System.Threading.Thread.EnableAutoreleasePool true veya false .NET 6
MSBuild özelliği AutoreleasePoolSupport true veya false .NET 6
Ortam değişkeni Geçersiz Yok Geçersiz

Örnekler

runtimeconfig.json dosyası:

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

runtimeconfig.template.json dosyası:

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

Proje dosyası:

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

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

</Project>