Usando threads e threading

Com o .NET, você pode escrever aplicativos que executam várias operações ao mesmo tempo. As operações com o potencial de atrasar outras operações podem ser executadas em threads separados, um processo conhecido como multithreading ou free threading.

Aplicativos que usam multithreading são mais responsivos a entradas do usuário porque a interface do usuário permanece ativa, enquanto tarefas com uso intensivo do processador são executadas em threads separados. O multithreading também é útil quando você cria aplicativos escalonáveis, porque você pode adicionar threads conforme a carga de trabalho aumenta.

Observação

Se precisar de mais controle sobre o comportamento dos threads de seu aplicativo, você poderá gerenciar os threads por conta própria. No entanto, a programação multi-threaded é bastante simplificada com as classes System.Threading.Tasks.Parallel e System.Threading.Tasks.Task, PLINQ (LINQ Paralelo), classes de coleta simultânea no namespace System.Collections.Concurrent e um modelo de programação com base no conceito de tarefas em vez de threads. Para obter mais informações, confira Programação paralela e TPL (biblioteca de paralelismo de tarefas).

Como criar e iniciar um thread

Você cria um thread criando uma instância da classe System.Threading.Thread. Você fornece o nome do método que deseja executar no novo thread para o construtor. Para iniciar um thread criado, chame o método Thread.Start. Para obter mais informações e exemplos, confira o artigo Criando threads e passando dados na hora de início e a referência da API Thread.

Como interromper um thread

Para terminar a execução de um thread, use o System.Threading.CancellationToken. Ele fornece uma maneira unificada de parar threads de forma cooperativa. Para saber mais, confira Cancelamento em threads gerenciados.

Às vezes, não é possível interromper um thread de modo cooperativo, pois ele executa código de terceiros não projetado para cancelamento cooperativo. Nesse caso, talvez você queira encerrar a execução à força. Para encerrar a execução de um thread à força, no .NET Framework, você pode usar o método Thread.Abort. Esse método gera uma ThreadAbortException no thread em que é invocado. Para obter mais informações, confira Destruindo threads. Não há suporte para o método Thread.Abort no .NET Core. Se você precisar encerrar a execução do código de terceiros à força no .NET Core, execute-o no processo separado e use o método Process.Kill.

O System.Threading.CancellationToken não está disponível antes do .NET Framework 4. Para interromper um thread em versões mais antigas do .NET Framework, use as técnicas de sincronização de thread para implementar o cancelamento cooperativo manualmente. Por exemplo, você pode criar o campo booliano volátil shouldStop e usá-lo para solicitar que o código executado pelo thread pare. Para obter mais informações, consulte volátil na referência do C# e System.Threading.Volatile.

Use o método Thread.Join para fazer com que o thread de chamada espere o encerramento do thread que está sendo parado.

Como pausar ou interromper um thread

Use o método Thread.Sleep para pausar o thread atual por um período de tempo especificado. Você pode interromper um thread bloqueado chamando o método Thread.Interrupt. Para obter mais informações, confira Pausando e interrompendo threads.

Propriedades do thread

A tabela a seguir apresenta algumas das propriedades do Thread:

Propriedade Descrição
IsAlive Retorna true quando um thread foi iniciado e ainda não foi encerrado normalmente ou anulado.
IsBackground Obtém ou define um valor booliano que indica se um thread é um thread em segundo plano. Os threads em segundo plano são como os threads em primeiro plano. No entanto, um thread em segundo plano não impede que um processo pare. Após todos os threads de primeiro plano que pertencem a um processo serem parados, o Common Language Runtime finaliza o processo chamando o método Abort em threads em segundo plano que ainda estão ativos. Para obter mais informações, confira Threads em primeiro plano e em segundo plano.
Name Obtém ou define o nome de um thread. Usado com mais frequência para descobrir threads individuais quando você depura.
Priority Obtém ou define um valor de ThreadPriority que é usado pelo sistema operacional para priorizar o agendamento de threads. Para obter mais informações, confira Agendando threads e a referência de ThreadPriority.
ThreadState Obtém um valor ThreadState que contém os estados atuais de um thread.

Confira também