Threads e threading
O multithreading permite que você aumente a capacidade de resposta do seu aplicativo e, se ele for executado em um sistema multiprocessador ou multi-core, 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 à 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 do thread quando a execução do thread é pausada. O contexto do thread inclui todas as informações de que o thread precisa para retomar a execução sem problemas, incluindo o conjunto de registradores 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çamento virtual. Um thread pode executar qualquer parte do código do programa, incluindo partes que estão sendo executadas por outro thread.
Nota
O .NET Framework fornece uma maneira de isolar aplicativos dentro de 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 e threads de aplicativos 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 geralmente 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 multiprocessador ou multi-core para aumentar a taxa de transferência do aplicativo.
Considere um aplicativo de á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 principal e tornariam a interface do usuário não responsiva. Você também pode usar um thread dedicado para comunicação de rede ou dispositivo para responder melhor às mensagens ou eventos recebidos.
Se o seu programa executa operações que podem ser feitas em paralelo, o tempo total de execução pode ser reduzido executando essas operações em threads separados e executando o programa em um sistema multiprocessador ou multi-core. Em tal sistema, o uso de multithreading pode aumentar a taxa de transferência, juntamente com o aumento da capacidade de resposta.
Como usar multithreading no .NET
A partir do .NET Framework 4, a maneira recomendada de utilizar multithreading é usar TPL (Task Parallel Library) e PLINQ (Parallel LINQ). Para obter mais informações, consulte Programação paralela.
Tanto a TPL quanto a PLINQ dependem dos 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 de threads. Para obter mais informações, consulte O pool de threads gerenciados.
Por fim, você pode usar a System.Threading.Thread classe que representa um thread gerenciado. Para obter mais informações, consulte 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 corrida, você deve sincronizar o acesso do thread a ele. Você também pode querer 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, consulte Visão geral das primitivas de sincronização.
Manipule exceções em threads. Exceções não tratadas em threads geralmente encerram o processo. Para obter mais informações, consulte Exceções em threads gerenciados.