Usando threads e threading

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

Os aplicativos que usam multithreading são mais responsivos à entrada do usuário porque a interface do usuário permanece ativa à medida que tarefas intensivas do processador são executadas em threads separados. Multithreading também é útil quando você cria aplicativos escaláveis porque você pode adicionar threads à medida que a carga de trabalho aumenta.

Nota

Se você precisar de mais controle sobre o comportamento dos threads do aplicativo, você mesmo pode gerenciar os threads. No entanto, a programação multithreaded é muito simplificada com as System.Threading.Tasks.Parallel classes e System.Threading.Tasks.Task , Parallel LINQ (PLINQ), classes de coleção simultâneas no namespace e um modelo de programação baseado no System.Collections.Concurrent conceito de tarefas em vez de threads. Para obter mais informações, consulte Programação paralela e biblioteca paralela de tarefas (TPL).

Como: Criar e iniciar um novo thread

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

Como: Parar um thread

Para encerrar a execução de um thread, use o System.Threading.CancellationToken. Ele fornece uma maneira unificada de parar threads cooperativamente. Para obter mais informações, consulte Cancelamento em threads gerenciados.

Às vezes, não é possível parar um thread cooperativamente porque ele executa código de terceiros não projetado para cancelamento cooperativo. Nesse caso, você pode querer encerrar sua execução à força. Para encerrar a execução de um thread forçosamente, no .NET Framework você pode usar o Thread.Abort método. Esse método gera um ThreadAbortException no thread no qual ele é invocado. Para obter mais informações, consulte Destruindo threads. O Thread.Abort método não é suportado no .NET Core. Se você precisar encerrar a execução de código de terceiros forçosamente no .NET Core, execute-o no processo separado e use o Process.Kill método.

O System.Threading.CancellationToken não está disponível antes do .NET Framework 4. Para parar 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 shouldStop booleano volátil e usá-lo para solicitar que o código executado pelo thread pare. Para obter mais informações, consulte volátil em C# Reference e System.Threading.Volatile.

Use o Thread.Join método para fazer com que o thread de chamada aguarde o término do thread que está sendo interrompido.

Como: Pausar ou interromper um thread

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

Propriedades do thread

A tabela a seguir apresenta algumas das Thread propriedades:

Property Description
IsAlive Retorna true se um thread tiver sido iniciado e ainda não tiver terminado normalmente ou abortado.
IsBackground Obtém ou define um Boolean que indica se um thread é um thread em segundo plano. Os threads de plano de fundo são como threads de primeiro plano. No entanto, um thread em segundo plano não impede que um processo pare. Uma vez que todos os threads de primeiro plano que pertencem a um processo tenham parado, o common language runtime termina o processo chamando o Abort método em threads em segundo plano que ainda estão vivos. Para obter mais informações, consulte Threads em primeiro plano e em segundo plano.
Name Obtém ou define o nome de um thread. Mais freqüentemente usado para descobrir threads individuais quando você depurar.
Priority Obtém ou define um ThreadPriority valor que é usado pelo sistema operacional para priorizar o agendamento de threads. Para obter mais informações, consulte Agendamento de threads e a ThreadPriority referência.
ThreadState Obtém um ThreadState valor que contém os estados atuais de um thread.

Consulte também