Compartilhar via


Métodos System.Threading.Monitor.Wait

Este artigo fornece comentários complementares à documentação de referência para esta API.

método Wait(Object, Int32, Boolean)

Esse método não retorna até que readquira um bloqueio exclusivo no parâmetro obj.

O thread que atualmente possui o bloqueio no objeto especificado invoca esse método para liberar o objeto para que outro thread possa acessá-lo. O chamador fica bloqueado enquanto aguarda para readquirir o bloqueio. Esse método é chamado quando o chamador precisa aguardar uma alteração de estado que ocorrerá como resultado das operações de outro thread.

O tempo limite garante que a thread atual não fique bloqueada indefinidamente se outra thread liberar o bloqueio sem antes chamar o método Pulse ou o método PulseAll. Ele também move o thread para a fila de prontidão, ignorando outros threads à frente dele na fila de espera, para que ele possa readquirir o bloqueio mais cedo. A thread pode testar o valor retornado do método Wait para determinar se ela requisitou novamente o bloqueio antes do timeout. A thread pode avaliar as condições que a fizeram entrar na espera e, se necessário, chamar o método Wait novamente.

Quando um thread chama Wait, ele libera o bloqueio e entra na fila de espera. Neste ponto, o próximo segmento na fila de prontidão (se houver uma) pode assumir o controle do bloqueio. O thread que invocou Wait permanece na fila de espera até que um thread que contém o bloqueio invoque PulseAllou seja o próximo na fila e um thread que contém o bloqueio invoca Pulse. No entanto, se millisecondsTimeout se esgotar antes que outro thread invoque o método Pulse ou PulseAll deste objeto, o thread original será movido para a fila de prontidão para recuperar o bloqueio.

Observação

Se Infinite for especificado para millisecondsTimeout parâmetro, esse método será bloqueado indefinidamente, a menos que o titular do bloqueio chame Pulse ou PulseAll. Se millisecondsTimeout for igual a 0, o thread que chama Wait libera o bloqueio e, em seguida, entra imediatamente na fila de prontidão para recuperar o bloqueio.

O chamador executa Wait uma vez, independentemente do número de vezes que Enter tem sido invocado para o objeto especificado. Conceitualmente, o Wait método armazena o número de vezes que o chamador invoca no Enter objeto e invoca Exit quantas vezes for necessário para liberar totalmente o objeto bloqueado. O chamador então bloqueia enquanto aguarda para readquirir o objeto. Quando o chamador readquire o bloqueio, o sistema chama Enter quantas vezes for necessário para restaurar a contagem salva Enter para o chamador. A chamada Wait libera o bloqueio apenas para o objeto especificado; se o chamador for o proprietário dos bloqueios em outros objetos, esses bloqueios não serão liberados.

Observação

Um objeto sincronizado contém várias referências, incluindo uma referência ao thread que atualmente mantém o bloqueio, uma referência à fila pronta, que contém os threads que estão prontos para obter o bloqueio e uma referência à fila de espera, que contém os threads que estão aguardando a notificação de uma alteração no estado do objeto.

Os Pulsemétodos , PulseAlle Wait devem ser invocados de dentro de um bloco de código sincronizado.

As observações do método Pulse explicam o que acontece se Pulse for chamado quando nenhum thread está aguardando.

método Wait(Object, TimeSpan, Boolean)

Esse método não retorna até que readquira um bloqueio exclusivo no parâmetro obj.

O thread que atualmente possui o bloqueio no objeto especificado invoca esse método para liberar o objeto para que outro thread possa acessá-lo. O chamador fica bloqueado enquanto aguarda para readquirir o bloqueio. Esse método é chamado quando o chamador precisa aguardar uma alteração de estado que ocorrerá como resultado das operações de outro thread.

O tempo limite garante que a thread atual não fique bloqueada indefinidamente se outra thread liberar o bloqueio sem antes chamar o método Pulse ou o método PulseAll. Ele também move o thread para a fila de prontidão, ignorando outros threads à frente dele na fila de espera, para que ele possa readquirir o bloqueio mais cedo. A thread pode testar o valor retornado do método Wait para determinar se ela requisitou novamente o bloqueio antes do timeout. A thread pode avaliar as condições que a fizeram entrar na espera e, se necessário, chamar o método Wait novamente.

Quando um thread chama Wait, ele libera o bloqueio e entra na fila de espera. Neste ponto, o próximo segmento na fila de prontidão (se houver uma) pode assumir o controle do bloqueio. O thread que invocou Wait permanece na fila de espera até que um thread que contém o bloqueio invoque PulseAllou seja o próximo na fila e um thread que contém o bloqueio invoca Pulse. No entanto, se timeout milissegundos se passam antes que outro thread invoque o método Pulse ou PulseAll deste objeto, o thread original será movido para a fila de prontidão para recuperar o bloqueio.

Observação

Se um TimeSpan que representa -1 milissegundos for especificado para o parâmetro timeout, esse método será bloqueado indefinidamente, a menos que o titular do bloqueio chame Pulse ou PulseAll. Se timeout for igual a 0 milissegundos, o thread que chama Wait libera o bloqueio e, em seguida, entra imediatamente na fila de prontidão para recuperar o bloqueio.

O chamador executa Wait uma vez, independentemente do número de vezes que Enter tem sido invocado para o objeto especificado. Conceitualmente, o Wait método armazena o número de vezes que o chamador invoca no Enter objeto e invoca Exit quantas vezes for necessário para liberar totalmente o objeto bloqueado. O chamador então bloqueia enquanto aguarda para readquirir o objeto. Quando o chamador readquire o bloqueio, o sistema chama Enter quantas vezes for necessário para restaurar a contagem salva Enter para o chamador. A chamada Wait libera o bloqueio apenas para o objeto especificado; se o chamador for o proprietário dos bloqueios em outros objetos, esses bloqueios não serão liberados.

Observação

Um objeto sincronizado contém várias referências, incluindo uma referência ao thread que atualmente mantém o bloqueio, uma referência à fila pronta, que contém os threads que estão prontos para obter o bloqueio e uma referência à fila de espera, que contém os threads que estão aguardando a notificação de uma alteração no estado do objeto.

Os Pulsemétodos , PulseAlle Wait devem ser invocados de dentro de um bloco de código sincronizado.

As observações do método Pulse explicam o que acontece se Pulse for chamado quando nenhum thread está aguardando.

Sair do contexto

OexitContext parâmetro não tem efeito, a menos que o Wait método seja chamado de dentro de um contexto gerenciado não padrão. Isso pode acontecer se o thread estiver dentro de uma chamada para uma instância de uma classe derivada de ContextBoundObject. Mesmo que você esteja executando um método em uma classe que não é derivada de ContextBoundObject, como String, você pode estar em um contexto não padrão se um ContextBoundObject estiver em sua pilha no domínio do aplicativo atual.

Quando seu código está sendo executado em um contexto não padrão, especificar true para exitContext fazer com que o thread saia do contexto gerenciado não padrão (ou seja, fazer a transição para o contexto padrão) antes de executar o Wait método. Ele retorna ao contexto não padrão original após a conclusão da chamada para o Wait método.

Isso pode ser útil quando a classe associada ao contexto tem o SynchronizationAttribute atributo aplicado. Nesse caso, todas as chamadas para membros da classe são sincronizadas automaticamente e o domínio de sincronização é todo o corpo do código da classe. Se o código na pilha de chamadas de um membro chamar o método Wait e especificar true para exitContext, o thread sairá do domínio de sincronização, permitindo que um thread bloqueado em uma chamada para qualquer membro do objeto prossiga. Quando o Wait método retorna, o thread que fez a chamada deve aguardar para reentrar no domínio de sincronização.