Threads e threading
O multithreading permite aumentar a capacidade de resposta do seu aplicativo e, se esse aplicativo é executado em um sistema com vários processadores ou vários núcleos, permite também aumentar sua taxa de transferência.
Processos e threads
Um processo é um programa em execução. Um sistema operacional usa processos para separar os aplicativos que estão sendo executados. Um thread é a unidade básica para a qual um sistema operacional aloca tempo do processador. Cada thread tem uma prioridade de agendamento e mantém um conjunto de estruturas que o sistema usa para salvar o contexto do thread quando a execução do thread é colocada em pausa. O contexto de thread inclui todas as informações que o thread precisa para continuar a execução sem interrupções, incluindo o conjunto de registros de CPU e pilha do thread. Vários threads podem ser executados no contexto de um processo. Todos os threads de um processo compartilham seu espaço de endereço virtual. Um thread pode executar qualquer parte do código do programa, incluindo partes que estão sendo executadas no momento por outro thread.
Observação
O .NET Framework fornece uma maneira de isolar aplicativos em um processo com o uso de domínios de aplicativo. (Os domínios do aplicativo não estão disponíveis no .NET Core). Para obter mais informações, consulte a seção Domínios do aplicativo e threads do artigo Domínios do aplicativo.
Por padrão, um programa .NET é iniciado com um único thread, geralmente chamado de thread primário. No entanto, ele pode criar threads adicionais para executar código em paralelo ou simultaneamente com o thread primário. Esses threads são chamados de threads de trabalho.
Quando usar vários threads
Você usa vários threads para aumentar a capacidade de resposta do seu aplicativo e para aproveitar um sistema com vários processadores ou vários núcleos para aumentar a taxa de transferência do aplicativo.
Considere um aplicativo da área de trabalho em que o thread primário é responsável por elementos da interface do usuário e responde às ações do usuário. Use threads de trabalho para executar operações demoradas que, caso contrário, ocupariam o thread primário e fariam com que a interface do usuário parasse de responder. Você também pode usar um thread dedicado para que a comunicação com a rede ou com o dispositivo responda melhor a mensagens ou eventos de entrada.
Se o programa realiza operações que podem ser executadas em paralelo, o tempo de execução total pode ser diminuído executando essas operações em threads separados e executando o programa em um sistema com vários processadores ou vários núcleos. Em um sistema desse tipo, o uso de multithreading pode resultar aumentar a taxa de transferência, além de uma maior capacidade de resposta.
Como usar multithreading em .NET
Começando com o .NET Framework 4, a maneira recomendada para utilizar o multithreading é usar TPL (biblioteca de paralelismo de tarefas) e PLINQ (Parallel LINQ). Para obter mais informações, veja Programação paralela.
Tanto TPL quanto PLINQ contam com os threads ThreadPool. A classe System.Threading.ThreadPool fornece um pool de threads de trabalho a um aplicativo .NET. Você também pode usar threads de pool. Para obter mais informações, veja O pool de threads gerenciados.
Por fim, você pode usar a classe System.Threading.Thread, que representa um thread gerenciado. Para obter mais informações, veja Usando threads e threading.
É possível que vários threads precisem acessar um recurso compartilhado. Para manter o recurso em um estado não corrompido e evitar condições de corrida, é necessário sincronizar o acesso do thread a ele. Também pode ser conveniente coordenar a interação de vários threads. O .NET fornece uma variedade de tipos que você pode usar para sincronizar o acesso a um recurso compartilhado ou coordenar a interação de thread. Para obter mais informações, veja Visão geral dos primitivos de sincronização.
Não se esqueça de tratar as exceções nos threads. Exceções sem tratamento nos threads geralmente encerram o processo. Para obter mais informações, veja Exceções em threads gerenciados.