Conjunto de threads C#

Resumo : neste tutorial, você aprenderá como usar a Threadpoolclasse C# para gerenciar threads com mais eficiência.

Introdução ao Threadpool C#

No tutorial anterior, você aprendeu como desenvolver aplicativos multithread criando threads manualmente usando a Threadclasse.

Normalmente, o número de threads que o aplicativo precisa é desconhecido de antemão. Além disso, o número ideal de threads que um aplicativo deve ter depende de alguns fatores externos, incluindo:

  • O número de núcleos da CPU.
  • O tipo de tarefas que precisam ser executadas.
  • Performance do sistema.

Se você não considerar esses fatores cuidadosamente, poderá sobrecarregar o sistema.

Uma solução para esse problema é usar um pool de threads.

Por definição, um pool de threads é um pool gerenciado de threads que pode ser usado para executar tarefas simultaneamente. Os threads gerenciados pelo pool de threads são frequentemente chamados de threads de trabalho. Os threads de trabalho são otimizados para tarefas de curta duração. Além disso, os threads de trabalho são threads de segundo plano .

O pool de threads funciona da seguinte maneira:

  • Primeiro, um pool de threads gera vários threads antecipadamente.
  • Segundo, quando você envia uma tarefa para um conjunto de encadeamentos, o conjunto de encadeamentos adiciona a tarefa a uma fila e atribui um encadeamento de um conjunto para executar a tarefa.
  • Terceiro, assim que o thread conclui a tarefa, o pool de threads retorna o thread ao pool, pronto para executar a próxima tarefa.

Ao fazer isso, o pool de threads pode reutilizar threads e evitar a sobrecarga de criação e destruição de threads para cada tarefa, o que é muito caro em termos de tempo e recursos.

A imagem a seguir ilustra como funciona o pool de threads:

Para criar um pool de threads, você usa a ThreadPoolclasse. A ThreadPoolclasse fornece recursos QueueUserWorkItempara enviar tarefas ao pool de threads.

O QueueUserWorkItemmétodo enfileira um método para execução. Em outras palavras, o método é executado quando um thread no pool de threads está pronto para execução.

O QueueUserWorkItemmétodo aceita uma instância do WaitCallbackdelegado com a seguinte assinatura.

public delegate void WaitCallback(object? state);Linguagem de código:  C#  ( cs )

No WaitCallbackdelegado, o stateargumento é um objeto que contém informações utilizadas pelo retorno de chamada.

Exemplo de threadpool em C#

O exemplo a seguir demonstra como usar a ThreadPoolclasse para criar um pool de threads:

using static System.Console;

static void CheckHttpStatus(string url)
{
    HttpClient client = new();
    var response = client.GetAsync(url).Result;
    WriteLine($"The HTTP status code of {url} is {response.StatusCode}");

}

List<string> urls = new(){
    "https://www.google.com/",
    "https://www.duckduckgo.com/",
    "https://www.yahoo.com/",
};

foreach (var url in urls)
{
    ThreadPool.QueueUserWorkItem((state) => CheckHttpStatus(url));
}


// wait for all thread to complete
// and press a key
Console.Read();Linguagem de código:  C#  ( cs )

Como funciona.

Primeiro, defina um método estático CheckHttpStatuspara verificar o código de status HTTP de uma URL:

static void CheckHttpStatus(string url)
{
    HttpClient client = new();
    var response = client.GetAsync(url).Result;
    WriteLine($"The HTTP status code of {url} is {response.StatusCode}");
}Linguagem de código:  C#  ( cs )

Em segundo lugar, crie uma lista URLspara verificar:

List<string> urls = new(){
    "https://www.google.com/",
    "https://www.duckduckgo.com/",
    "https://www.yahoo.com/",
};Linguagem de código:  C#  ( cs )

Terceiro, verifique o código de status HTTP de cada URL da lista passando uma expressão lambda para o QueueUserWorkItem()método do ThreadPoolmétodo:

foreach (var url in urls)
{
    ThreadPool.QueueUserWorkItem((state) => CheckHttpStatus(url));
}Linguagem de código:  C#  ( cs )

Por fim, adicione o Console.Read()que bloqueia o thread principal para aguardar a conclusão de todos os threads no pool de threads.

É importante observar que você pode esperar que todas as tarefas sejam concluídas, mas abordaremos isso no tutorial subsequente.

Resumo

  • Use um pool de threads para melhorar o desempenho do aplicativo, fazendo uso eficiente dos recursos disponíveis e reduzindo a sobrecarga de criação e destruição de threads.
  • Use a ThreadPoolclasse para criar um pool de threads.
  • Use o QueueUserWorkItemmétodo da ThreadPoolclasse para enviar tarefas ao pool de threads.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *