Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo detalha as definições que pode usar para configurar a threading em .NET.
Usar todos os grupos de CPU no Windows
- Em máquinas que têm múltiplos grupos de CPU, esta definição configura se componentes como o pool de threads utilizam todos os grupos de CPU ou apenas o grupo principal de CPU do processo. A definição também afeta o que Environment.ProcessorCount devolve.
- Quando esta configuração está ativada, todos os grupos de CPU são usados e as threads também são distribuídas automaticamente entre os grupos de CPU por defeito.
- Esta definição está ativada por defeito no Windows 11 e versões posteriores, e desativada por defeito no Windows 10 e versões anteriores. Para que esta configuração tenha efeito quando ativada, o GC deve também estar configurado para usar todos os grupos de CPU; para mais informações, veja GC CPU groups.
| Nome da configuração | Valores | |
|---|---|---|
| runtimeconfig.json | N/A | N/A |
| Variável de ambiente | DOTNET_Thread_UseAllCpuGroups |
0 - deficientes1 - ativado |
Atribuir threads a grupos de CPU no Windows
- Em máquinas que têm múltiplos grupos de CPU e todos os grupos de CPU estão a ser usados, esta definição configura se os threads são automaticamente distribuídos entre os grupos de CPU.
- Quando esta definição está ativada, novos threads são atribuídos a um grupo de CPU de forma a tentar preencher totalmente um grupo de CPU já em uso antes de utilizar um novo grupo de CPU.
- Esta definição está ativada por predefinição.
| Nome da configuração | Valores | |
|---|---|---|
| runtimeconfig.json | N/A | N/A |
| Variável de ambiente | DOTNET_Thread_AssignCpuGroups |
0 - deficientes1 - ativado |
Threads mínimos
- Especifica o número mínimo de threads para o pool de threads de trabalho.
- Corresponde ao ThreadPool.SetMinThreads método.
| Nome da configuração | Valores | |
|---|---|---|
| runtimeconfig.json | System.Threading.ThreadPool.MinThreads |
Um inteiro que representa o número mínimo de threads |
| Propriedade MSBuild | ThreadPoolMinThreads |
Um inteiro que representa o número mínimo de threads |
| Variável de ambiente | N/A | N/A |
Examples
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
Ficheiro do projeto:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMinThreads>4</ThreadPoolMinThreads>
</PropertyGroup>
</Project>
Threads máximos
- Especifica o número máximo de threads para o pool de threads de trabalho.
- Corresponde ao ThreadPool.SetMaxThreads método.
| Nome da configuração | Valores | |
|---|---|---|
| runtimeconfig.json | System.Threading.ThreadPool.MaxThreads |
Um inteiro que representa o número máximo de threads |
| Propriedade MSBuild | ThreadPoolMaxThreads |
Um inteiro que representa o número máximo de threads |
| Variável de ambiente | N/A | N/A |
Examples
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
Ficheiro do projeto:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
</PropertyGroup>
</Project>
Pool de threads do Windows
- Para projetos no Windows, configura se a gestão do pool de threads é delegada ao pool de threads do Windows.
- Se omitires esta definição ou se a plataforma não for o Windows, usa-se o pool de threads .NET em vez disso.
- Apenas as aplicações publicadas com AOT nativo no Windows usam o pool de threads do Windows por defeito, para o qual pode optar por usar o pool de threads .NET desativando a definição de configuração.
- O pool de threads do Windows pode ter um desempenho melhor em alguns casos, como em casos em que o número mínimo de threads está configurado para um valor elevado, ou quando o pool de threads do Windows já está a ser fortemente utilizado pela aplicação. Também podem existir casos em que o pool de threads .NET tem melhor desempenho, como em manuseamento pesado de I/O em máquinas maiores. É aconselhável verificar as métricas de desempenho ao alterar esta configuração de configuração.
- Algumas APIs não são suportadas ao utilizar o pool de threads do Windows, como ThreadPool.SetMinThreads, ThreadPool.SetMaxThreads, e ThreadPool.BindHandle(SafeHandle). As definições de configuração do pool de threads para threads mínimo e máximo também não são eficazes. Uma alternativa ThreadPool.BindHandle(SafeHandle) é a ThreadPoolBoundHandle aula.
| Nome da configuração | Valores | Versão introduzida | |
|---|---|---|---|
| runtimeconfig.json | System.Threading.ThreadPool.UseWindowsThreadPool |
true - ativadofalse - deficientes |
.NET 8 |
| Propriedade MSBuild | UseWindowsThreadPool |
true - ativadofalse - deficientes |
.NET 8 |
| Variável de ambiente | DOTNET_ThreadPool_UseWindowsThreadPool |
1 - ativado0 - deficientes |
.NET 8 |
Examples
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
Ficheiro do projeto:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<UseWindowsThreadPool>true</UseWindowsThreadPool>
</PropertyGroup>
</Project>
Injeção de threads em resposta a blocar itens de trabalho
Em alguns casos, o pool de threads deteta itens de trabalho que bloqueiam os seus threads. Para compensar, injeta mais roscas. No .NET 6+, pode usar as seguintes definições de configuração em tempo de execução para configurar a injeção de threads em resposta a itens de trabalho bloqueadores. Atualmente, estas definições só têm efeito para itens de trabalho que aguardam que outra tarefa seja concluída, como nos casos típicos de sincronização sobre assíncrono .
| runtimeconfig.json nome do cenário | Description | Versão introduzida |
|---|---|---|
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor |
Depois de atingida a contagem de threads baseada em MinThreads , este valor (após ser multiplicado pela contagem de processadores) especifica quantos threads adicionais podem ser criados sem atraso. |
.NET 6 |
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor |
Depois de atingida a contagem de threads baseada em ThreadsToAddWithoutDelay , este valor (após ser multiplicado pela contagem do processador) especifica após quantas threads seria adicionada uma adicional DelayStepMs ao atraso antes de cada nova thread ser criada. |
.NET 6 |
System.Threading.ThreadPool.Blocking.DelayStepMs |
Depois de atingida a contagem de threads baseada em ThreadsToAddWithoutDelay , este valor especifica quanto atraso adicional adicionar por ThreadsPerDelayStep thread, que será aplicado antes de cada nova thread ser criada. |
.NET 6 |
System.Threading.ThreadPool.Blocking.MaxDelayMs |
Depois de atingida a contagem de threads baseada em ThreadsToAddWithoutDelay , este valor especifica o atraso máximo a usar antes de cada nova thread ser criada. |
.NET 6 |
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage |
Por defeito, a taxa de injeção de threads em resposta ao bloqueio é limitada por heurísticas que determinam se existe memória física suficiente disponível. Em algumas situações, pode ser preferível injetar threads mais rapidamente, mesmo em situações de baixa memória. Podes desativar as heurísticas de uso de memória desligando este interruptor. | .NET 7 |
Como as definições de configuração entram em vigor
- Depois de atingida a contagem de threads baseada em
MinThreads, podem ser criados atéThreadsToAddWithoutDelaythreads adicionais sem demora. - Depois disso, antes de cada thread adicional ser criado, é induzido um atraso, começando por
DelayStepMs. - Por cada
ThreadsPerDelayStepthread que é adicionado com um atraso, é adicionado umDelayStepMsadicional ao atraso. - O atraso não pode exceder
MaxDelayMs. - Os atrasos só são induzidos antes de criar threads. Se os threads já estiverem disponíveis, serão lançados sem demora para compensar o bloqueio dos itens de trabalho.
- Também são usados o uso físico da memória e os limites e, para além de um determinado limite, o sistema passa para uma injeção de thread mais lenta.
Examples
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
AutoreleasePool para threads geridos
Esta opção configura se cada thread gerido recebe um NSAutoreleasePool implícito ao correr numa plataforma macOS suportada.
| Nome da configuração | Valores | Versão introduzida | |
|---|---|---|---|
| runtimeconfig.json | System.Threading.Thread.EnableAutoreleasePool |
true ou false |
.NET 6 |
| Propriedade MSBuild | AutoreleasePoolSupport |
true ou false |
.NET 6 |
| Variável de ambiente | N/A | N/A | N/A |
Examples
runtimeconfig.json ficheiro:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
}
runtimeconfig.template.json arquivo:
{
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
Ficheiro do projeto:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AutoreleasePoolSupport>true</AutoreleasePoolSupport>
</PropertyGroup>
</Project>