Compartilhar via


Threads e threading

O multithreading permite que você aumente a capacidade de resposta do aplicativo e, se o aplicativo for executado em um sistema multiprocessador ou multi-núcleo, aumente 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 o 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 de thread quando a execução do thread é pausada. 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 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 de aplicativo não estão disponíveis no .NET Core.) Para obter mais informações, consulte a seção Domínios de aplicativo e threads do artigo Domínios de 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 aplicativo e aproveitar um sistema multiprocessador ou multi-núcleo para aumentar a taxa de transferência do aplicativo.

Considere um aplicativo da área de trabalho, no qual o thread primário é responsável pelos 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 de rede ou dispositivo seja mais responsiva a mensagens ou eventos de entrada.

Se o programa executar operações que podem ser feitas em paralelo, o tempo total de execução poderá ser reduzido executando essas operações em threads separados e executando o programa em um sistema multiprocessador ou multi-núcleo. Nesse sistema, o uso de multithreading pode aumentar a taxa de transferência juntamente com o aumento da capacidade de resposta.

Como usar multithreading em .NET

A partir do .NET Framework 4, a maneira recomendada de utilizar o multithreading é usar a TPL (Biblioteca Paralela de Tarefas) e o PLINQ (Parallel LINQ). Para obter mais informações, consulte Programação paralela.

TPL e PLINQ dependem em ThreadPool threads. A System.Threading.ThreadPool classe fornece um aplicativo .NET com um pool de threads de trabalho. Você também pode usar threads de pool. Para obter mais informações, consulte o pool de threads gerenciado.

Por fim, você pode usar a System.Threading.Thread classe que representa um thread gerenciado. Para obter mais informações, veja Usando threads e threading.

Vários threads podem precisar acessar um recurso compartilhado. Para manter o recurso em um estado não corrompido e evitar condições de disputa, você deve sincronizar o acesso das threads a ele. Você também pode querer coordenar a interação de vários threads. O .NET fornece um intervalo 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, consulte Visão geral dos primitivos de sincronização.

Não se esqueça de tratar as exceções nos threads. Exceções sem tratamento em threads geralmente encerram o processo. Para obter mais informações, consulte Exceções em threads gerenciados.

Consulte também