Compartilhar via


Pausar e retomar os Threads

As maneiras mais comuns para sincronizar as atividades de threads são segmentos de bloco e lançamento ou para bloquear objetos ou regiões de código. Para obter mais informações sobre esses bloqueio e mecanismos de bloqueio, consulte Visão geral dos primitivos de sincronização.

Você também pode ter se dormir colocados de threads. Quando os segmentos são bloqueados ou em repouso, você pode usar um ThreadInterruptedException dividi-las de seus estados de espera.

O método thread. Sleep

Chamar o Thread.Sleep método faz com que o segmento atual bloquear imediatamente para o número de milissegundos que você passar para Thread.Sleep, produzindo o restante da sua fração de tempo para o outro thread. Um thread não é possível chamar Thread.Sleep em outro segmento.

Chamando Thread.Sleep com Timeout.Infinite faz com que um segmento no modo de suspensão até que ela seja interrompida por outro thread que chama Thread.Interrupt, ou até que ele seja finalizado pelo Thread.Abort.

Interromper Threads

Você pode interromper um segmento em espera, chamando Thread.Interrupt no thread bloqueado para lançar um ThreadInterruptedException, que interrompe o segmento de chamada de bloqueio. O thread deve detectar o ThreadInterruptedException e fazer o que for apropriado para continuar trabalhando. Se o thread ignora a exceção, o runtime captura a exceção e pára o thread.

Observação

Se o thread de destino não estiver bloqueado quando Thread.Interrupt é chamado, o thread não é interrompido até que ele bloqueia.Se nunca bloqueia o segmento, ele pôde ser concluída sem nunca ser interrompida.

Se uma espera uma espera gerenciada, em seguida, Thread.Interrupt e Thread.Abort ambos o thread de ativação imediatamente. Se uma espera uma espera de não gerenciada (por exemplo, uma plataforma de invocar a chamada para o Win32 WaitForSingleObject função), nenhuma das Thread.Interrupt nem Thread.Abort pode assumir o controle do thread até que ele retorne ao ou chamadas para código gerenciado. No código gerenciado, o comportamento é:

Suspender e continuar (obsoleto)

Observação importanteImportante

No.NET Framework versão 2.0, o Thread.Suspend e Thread.Resume métodos marcado como obsoletos e serão removidos em uma versão futura.

Você também pode pausar um thread chamando Thread.Suspend. Quando um thread chama Thread.Suspend em si, os blocos de chamada até que o segmento é retomado por outro thread. Quando um thread chama Thread.Suspend em outro thread, a chamada é uma chamada sem bloqueio, que faz com que o outro thread pausar. Chamando Thread.Resume quebra a outro thread de estado de suspensão e faz com que o segmento continuar a execução, independentemente de quantas vezes Thread.Suspend foi chamado. Por exemplo, se você chamar Thread.Suspend cinco vezes consecutivas e, em seguida, chamada Thread.Resume, o segmento continua a execução imediatamente após a chamada para Thread.Resume.

Ao contrário de Thread.Sleep, Thread.Suspend não faz com que um segmento interromper imediatamente a execução. O common language runtime deve aguardar até que o segmento atingiu um ponto de seguro antes que ele pode suspender o thread. Um segmento não pode ser suspenso se não foi iniciado ou se ele parou. Para obter detalhes sobre pontos de seguros, consulte Thread.Suspend, coleta de lixo e os pontos de seguros.

Observação importanteImportante

O Thread.Suspend e Thread.Resume métodos são geralmente não é útil para aplicativos e não devem ser confundidos com mecanismos de sincronização.Porque Thread.Suspend e Thread.Resume não contar com a cooperação do thread que está sendo controlado, eles são altamente intrusivos e pode resultar em problemas sérios de aplicativos como deadlocks (por exemplo, se você suspender um segmento que contém um recurso que precisará de um outro thread).

Alguns aplicativos precisam controlar a prioridade de segmentos para melhorar o desempenho. Para fazer isso, você deve usar o Priority propriedade em vez de Thread.Suspend.

Consulte também

Referência

Thread

ThreadInterruptedException

ThreadAbortException

Conceitos

Visão geral dos primitivos de sincronização

Thread.Suspend, coleta de lixo e pontos de seguro

Outros recursos

Threads gerenciadas

Usando segmentos e Threading