Monitor.Wait Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio.
Sobrecargas
| Name | Description |
|---|---|
| Wait(Object) |
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio. |
| Wait(Object, Int32) |
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio. Se o intervalo de tempo especificado expirar, a thread entra na fila pronta. |
| Wait(Object, TimeSpan) |
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio. Se o intervalo de tempo especificado expirar, a thread entra na fila pronta. |
| Wait(Object, Int32, Boolean) |
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio. Se o intervalo de tempo especificado expirar, a thread entra na fila pronta. Este método também especifica se o domínio de sincronização para o contexto (se estiver num contexto sincronizado) é encerrado antes da espera e readquirido depois. |
| Wait(Object, TimeSpan, Boolean) |
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio. Se o intervalo de tempo especificado expirar, a thread entra na fila pronta. Opcionalmente, sai do domínio de sincronização para o contexto sincronizado antes da espera e recupera o domínio depois. |
Wait(Object)
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio.
public:
static bool Wait(System::Object ^ obj);
public static bool Wait(object obj);
static member Wait : obj -> bool
Public Shared Function Wait (obj As Object) As Boolean
Parâmetros
- obj
- Object
O objeto em que esperar.
Devoluções
true se a chamada retornou porque o chamador recuperou o bloqueio para o objeto especificado. Este método não retorna se o bloqueio não for readquirido.
Exceções
O obj parâmetro é null.
O thread que chama não possui o bloqueio para o objeto especificado.
A thread que invoca Wait é posteriormente interrompida do estado de espera. Isto acontece quando outro thread chama o método desse Interrupt() thread.
Observações
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 é 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.
Quando um thread chama Wait, liberta o bloqueio do objeto e entra na fila de espera do objeto. O thread seguinte na fila ready do objeto (se existir) adquire o bloqueio e tem uso exclusivo do objeto. Todos os threads que chamam Wait permanecem na fila de espera até receberem um sinal de Pulse ou PulseAll, enviado pelo proprietário da fechadura. Se Pulse for enviada, apenas a thread no topo da fila de espera é afetada. Se PulseAll for enviada, todas as threads que estão à espera do objeto são afetadas. Quando o sinal é recebido, um ou mais threads saem da fila de espera e entram na fila pronta. Um fio na fila pronta é autorizado a recuperar o bloqueio.
Este método retorna quando o thread que chama recupera o bloqueio no objeto. Note que este método bloqueia indefinidamente se o detentor da fechadura não chamar Pulse ou PulseAll.
O chamador executa Wait uma vez, independentemente do número de vezes que Enter foi invocado para o objeto especificado. Conceitualmente, o método armazena Wait o número de vezes que o chamador invocou Enter no objeto e invoca Exit quantas vezes forem necessárias para liberar totalmente o objeto bloqueado. Em seguida, o chamador bloqueia enquanto espera para readquirir o objeto. Quando o chamador readquire o bloqueio, o sistema chama Enter tantas vezes quantas forem necessárias 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.
Note que um objeto sincronizado contém várias referências, incluindo uma referência ao thread que atualmente detém o bloqueio, uma referência à fila ready, que contém os threads prontos para obter o bloqueio, e uma referência à fila em espera, que contém os threads que aguardam notificação de uma alteração no estado do objeto.
Os Pulsemétodos , PulseAll, e Wait devem ser invocados de dentro de um bloco de código sincronizado.
As observações para o Pulse método explicam o que acontece se Pulse for chamado quando nenhum thread esteja à espera.
Ver também
Aplica-se a
Wait(Object, Int32)
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio. Se o intervalo de tempo especificado expirar, a thread entra na fila pronta.
public:
static bool Wait(System::Object ^ obj, int millisecondsTimeout);
public static bool Wait(object obj, int millisecondsTimeout);
static member Wait : obj * int -> bool
Public Shared Function Wait (obj As Object, millisecondsTimeout As Integer) As Boolean
Parâmetros
- obj
- Object
O objeto em que esperar.
- millisecondsTimeout
- Int32
O número de milissegundos a esperar antes do fio entrar na fila de pronto.
Devoluções
true se a fechadura fosse readquirida antes do tempo especificado decorrer; false se a fechadura foi readquirida após o tempo especificado. O método só regressa quando a fechadura é readquirida.
Exceções
O obj parâmetro é null.
O thread que chama não possui o bloqueio para o objeto especificado.
A thread que invoca Wait é posteriormente interrompida do estado de espera. Isto acontece quando outro thread chama o método desse Interrupt() thread.
O valor do millisecondsTimeout parâmetro é negativo, e não é igual a Infinite.
Observações
Este 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 é 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 time-out garante que o thread atual não seja bloqueado indefinidamente se outro thread liberar o bloqueio sem primeiro chamar o método Pulse ou PulseAll. Ele também move o thread para a fila pronta, ignorando outros threads à sua frente na fila de espera, para que ele possa readquirir o bloqueio mais cedo. A thread pode testar o valor de retorno do método Wait para determinar se readquiriu o bloqueio de novo antes do tempo limite. A thread pode avaliar as condições que fizeram com que entrasse na espera e, se necessário, chamar o método Wait novamente.
Quando um thread chama Wait, liberta o bloqueio do objeto e entra na fila de espera do objeto. O thread seguinte na fila ready do objeto (se existir) adquire o bloqueio e tem uso exclusivo do objeto. A thread que invocou Wait permanece na fila de espera até que uma thread que detém o bloqueio invoque PulseAll, ou até que ela seja a próxima na fila e uma thread que detenha o bloqueio invoque Pulse. No entanto, se millisecondsTimeout decorrer antes de outra thread invocar o método Pulse ou PulseAll deste objeto, a thread original será movida para a fila pronta para recuperar o bloqueio.
Note
Se Infinite foi especificado para o parâmetro millisecondsTimeout, este método bloqueia 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 pronta para recuperar o bloqueio.
O chamador executa Wait uma vez, independentemente do número de vezes que Enter foi invocado para o objeto especificado. Conceitualmente, o método armazena Wait o número de vezes que o chamador invocou Enter no objeto e invoca Exit quantas vezes forem necessárias para liberar totalmente o objeto bloqueado. Em seguida, o chamador bloqueia enquanto espera para readquirir o objeto. Quando o chamador readquire o bloqueio, o sistema chama Enter tantas vezes quantas forem necessárias 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.
Note
Um objeto sincronizado contém várias referências, incluindo uma referência ao thread que atualmente conté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 , PulseAll, e Wait devem ser invocados de dentro de um bloco de código sincronizado.
As observações para o Pulse método explicam o que acontece se Pulse for chamado quando nenhum thread esteja à espera.
Ver também
Aplica-se a
Wait(Object, TimeSpan)
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio. Se o intervalo de tempo especificado expirar, a thread entra na fila pronta.
public:
static bool Wait(System::Object ^ obj, TimeSpan timeout);
public static bool Wait(object obj, TimeSpan timeout);
static member Wait : obj * TimeSpan -> bool
Public Shared Function Wait (obj As Object, timeout As TimeSpan) As Boolean
Parâmetros
- obj
- Object
O objeto em que esperar.
Devoluções
true se a fechadura fosse readquirida antes do tempo especificado decorrer; false se a fechadura foi readquirida após o tempo especificado. O método só regressa quando a fechadura é readquirida.
Exceções
O obj parâmetro é null.
O thread que chama não possui o bloqueio para o objeto especificado.
A thread que invoca Wait é posteriormente interrompida do estado de espera. Isto acontece quando outro thread chama o método desse Interrupt() thread.
O valor do timeout parâmetro em milissegundos é negativo e não representa Infinite (-1 milissegundos), nem é maior que Int32.MaxValue.
Observações
Este 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 é 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 time-out garante que o thread atual não seja bloqueado indefinidamente se outro thread liberar o bloqueio sem primeiro chamar o método Pulse ou PulseAll. Ele também move o thread para a fila pronta, ignorando outros threads à sua frente na fila de espera, para que ele possa readquirir o bloqueio mais cedo. A thread pode testar o valor de retorno do método Wait para determinar se readquiriu o bloqueio de novo antes do tempo limite. A thread pode avaliar as condições que fizeram com que entrasse na espera e, se necessário, chamar o método Wait novamente.
Quando um thread chama Wait, liberta o bloqueio do objeto e entra na fila de espera do objeto. O thread seguinte na fila ready do objeto (se existir) adquire o bloqueio e tem uso exclusivo do objeto. A thread que invocou Wait permanece na fila de espera até que uma thread que detém o bloqueio invoque PulseAll, ou até que ela seja a próxima na fila e uma thread que detenha o bloqueio invoque Pulse. No entanto, se timeout decorrer antes de outra thread invocar o método Pulse ou PulseAll deste objeto, a thread original será movida para a fila pronta para recuperar o bloqueio.
Note
Se um TimeSpan que representa -1 milissegundos for especificado para o parâmetro timeout, este método bloqueia indefinidamente, a menos que o titular do bloqueio chame Pulse ou PulseAll. Se timeout for 0 milissegundos, o thread que chama Wait libera o bloqueio e, em seguida, entra imediatamente na fila pronta para recuperar o bloqueio.
O chamador executa Wait uma vez, independentemente do número de vezes que Enter foi invocado para o objeto especificado. Conceitualmente, o método armazena Wait o número de vezes que o chamador invocou Enter no objeto e invoca Exit quantas vezes forem necessárias para liberar totalmente o objeto bloqueado. Em seguida, o chamador bloqueia enquanto espera para readquirir o objeto. Quando o chamador readquire o bloqueio, o sistema chama Enter tantas vezes quantas forem necessárias 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.
Note
Um objeto sincronizado contém várias referências, incluindo uma referência ao thread que atualmente conté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 , PulseAll, e Wait devem ser invocados de dentro de um bloco de código sincronizado.
As observações para o Pulse método explicam o que acontece se Pulse for chamado quando nenhum thread esteja à espera.
Ver também
Aplica-se a
Wait(Object, Int32, Boolean)
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio. Se o intervalo de tempo especificado expirar, a thread entra na fila pronta. Este método também especifica se o domínio de sincronização para o contexto (se estiver num contexto sincronizado) é encerrado antes da espera e readquirido depois.
public:
static bool Wait(System::Object ^ obj, int millisecondsTimeout, bool exitContext);
public static bool Wait(object obj, int millisecondsTimeout, bool exitContext);
static member Wait : obj * int * bool -> bool
Public Shared Function Wait (obj As Object, millisecondsTimeout As Integer, exitContext As Boolean) As Boolean
Parâmetros
- obj
- Object
O objeto em que esperar.
- millisecondsTimeout
- Int32
O número de milissegundos a esperar antes do fio entrar na fila de pronto.
- exitContext
- Boolean
true sair e readquirir o domínio de sincronização do contexto (se num contexto sincronizado) antes da espera; caso contrário, false.
Devoluções
true se a fechadura fosse readquirida antes do tempo especificado decorrer; false se a fechadura foi readquirida após o tempo especificado. O método só regressa quando a fechadura é readquirida.
Exceções
O obj parâmetro é null.
Wait não é invocado a partir de um bloco de código sincronizado.
A thread que invoca Wait é posteriormente interrompida do estado de espera. Isto acontece quando outro thread chama o método desse Interrupt() thread.
O valor do millisecondsTimeout parâmetro é negativo, e não é igual a Infinite.
Observações
Para mais informações sobre esta API, consulte Observações suplementares da API para o Monitor.Wait.
Ver também
Aplica-se a
Wait(Object, TimeSpan, Boolean)
Liberta o bloqueio de um objeto e bloqueia o thread atual até que este recupere o bloqueio. Se o intervalo de tempo especificado expirar, a thread entra na fila pronta. Opcionalmente, sai do domínio de sincronização para o contexto sincronizado antes da espera e recupera o domínio depois.
public:
static bool Wait(System::Object ^ obj, TimeSpan timeout, bool exitContext);
public static bool Wait(object obj, TimeSpan timeout, bool exitContext);
static member Wait : obj * TimeSpan * bool -> bool
Public Shared Function Wait (obj As Object, timeout As TimeSpan, exitContext As Boolean) As Boolean
Parâmetros
- obj
- Object
O objeto em que esperar.
- exitContext
- Boolean
true sair e readquirir o domínio de sincronização do contexto (se num contexto sincronizado) antes da espera; caso contrário, false.
Devoluções
true se a fechadura fosse readquirida antes do tempo especificado decorrer; false se a fechadura foi readquirida após o tempo especificado. O método só regressa quando a fechadura é readquirida.
Exceções
O obj parâmetro é null.
Wait não é invocado a partir de um bloco de código sincronizado.
O fio que invoca Esperar é depois interrompido a partir do estado de espera. Isto acontece quando outro thread chama o método desse Interrupt() thread.
O timeout parâmetro é negativo e não representa Infinite (-1 milissegundos), ou é maior que Int32.MaxValue.
Observações
Para mais informações sobre esta API, consulte Observações suplementares da API para o Monitor.Wait.