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 é:
Thread.InterruptAtivar um segmento de qualquer espera que ele pode estar em e faz com que uma ThreadInterruptedException para ser lançada no thread de destino.
Thread.Aborté semelhante a Thread.Interrupt, exceto que ela faz com que uma ThreadAbortException para ser lançada no segmento. Para obter detalhes, consulte Segmentos destruir.
Suspender e continuar (obsoleto)
Importante |
---|
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.
Importante |
---|
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
Conceitos
Visão geral dos primitivos de sincronização
Thread.Suspend, coleta de lixo e pontos de seguro