Monitor.Wait Método

Definição

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock.

Sobrecargas

Wait(Object, Int32, Boolean)

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock. Se o intervalo de tempo limite especificado transcorrer, o thread entrará na fila pronta.If the specified time-out interval elapses, the thread enters the ready queue. Esse método também especifica se o domínio de sincronização para o contexto (se estiver em um contexto sincronizado) é encerrado antes do tempo de espera e readquirido posteriormente.This method also specifies whether the synchronization domain for the context (if in a synchronized context) is exited before the wait and reacquired afterward.

Wait(Object)

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock.

Wait(Object, Int32)

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock. Se o intervalo de tempo limite especificado transcorrer, o thread entrará na fila pronta.If the specified time-out interval elapses, the thread enters the ready queue.

Wait(Object, TimeSpan)

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock. Se o intervalo de tempo limite especificado transcorrer, o thread entrará na fila pronta.If the specified time-out interval elapses, the thread enters the ready queue.

Wait(Object, TimeSpan, Boolean)

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock. Se o intervalo de tempo limite especificado transcorrer, o thread entrará na fila pronta.If the specified time-out interval elapses, the thread enters the ready queue. Opcionalmente, encerra o domínio de sincronização para o contexto sincronizado antes do tempo de espera e, depois disso, readquire o domínio.Optionally exits the synchronization domain for the synchronized context before the wait and reacquires the domain afterward.

Wait(Object, Int32, Boolean)

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock. Se o intervalo de tempo limite especificado transcorrer, o thread entrará na fila pronta.If the specified time-out interval elapses, the thread enters the ready queue. Esse método também especifica se o domínio de sincronização para o contexto (se estiver em um contexto sincronizado) é encerrado antes do tempo de espera e readquirido posteriormente.This method also specifies whether the synchronization domain for the context (if in a synchronized context) is exited before the wait and reacquired afterward.

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 no qual aguardar.The object on which to wait.

millisecondsTimeout
Int32

O número de milissegundos de espera antes que o thread entre na fila pronta.The number of milliseconds to wait before the thread enters the ready queue.

exitContext
Boolean

true para sair e readquirir o domínio de sincronização para o contexto (se estiver em um contexto sincronizado) antes do tempo de espera; caso contrário, false.true to exit and reacquire the synchronization domain for the context (if in a synchronized context) before the wait; otherwise, false.

Retornos

Boolean

true se o bloqueio foi readquirido antes de ter decorrido o tempo especificado e false se o bloqueio foi readquirido depois que o tempo especificado foi decorrido.true if the lock was reacquired before the specified time elapsed; false if the lock was reacquired after the specified time elapsed. O método não retorna até que o bloqueio seja readquirido.The method does not return until the lock is reacquired.

Exceções

O parâmetro obj é null.The obj parameter is null.

Wait não é invocado de dentro de um bloco de código sincronizado.Wait is not invoked from within a synchronized block of code.

O thread que invoca Wait é posteriormente interrompido do estado de espera.The thread that invokes Wait is later interrupted from the waiting state. Isso acontece quando outro thread chama o método Interrupt() desse thread.This happens when another thread calls this thread's Interrupt() method.

O valor do parâmetro millisecondsTimeout é negativo e não é igual a Infinite.The value of the millisecondsTimeout parameter is negative, and is not equal to Infinite.

Comentários

Esse método não retorna até que ele readquira um bloqueio exclusivo no obj parâmetro.This method does not return until it reacquires an exclusive lock on the obj parameter.

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.The thread that currently owns the lock on the specified object invokes this method in order to release the object so that another thread can access it. O chamador é bloqueado enquanto aguarda a reaquisição do bloqueio.The caller is blocked while waiting to reacquire the lock. Esse método é chamado quando o chamador precisa aguardar uma alteração de estado que ocorrerá como resultado de operações de outro thread.This method is called when the caller needs to wait for a state change that will occur as a result of another thread's operations.

O tempo limite garante que o thread atual não bloqueie indefinidamente se outro thread liberar o bloqueio sem primeiro chamar o Pulse método ou PulseAll .The time-out ensures that the current thread does not block indefinitely if another thread releases the lock without first calling the Pulse or PulseAll method. Ele também move o thread para a fila pronta, ignorando outros threads à frente dele na fila de espera, para que ele possa readquirir o bloqueio mais cedo.It also moves the thread to the ready queue, bypassing other threads ahead of it in the wait queue, so that it can reacquire the lock sooner. O thread pode testar o valor de retorno do Wait método para determinar se ele readquiriu o bloqueio antes do tempo limite. O thread pode avaliar as condições que o fizeram para entrar na espera e, se necessário, chamar o Wait método novamente.The thread can test the return value of the Wait method to determine whether it reacquired the lock prior to the time-out. The thread can evaluate the conditions that caused it to enter the wait, and if necessary call the Wait method again.

Quando um thread chama Wait , ele libera o bloqueio e entra na fila de espera.When a thread calls Wait, it releases the lock and enters the waiting queue. Neste ponto, o próximo thread na fila pronta (se houver) tem permissão para assumir o controle do bloqueio.At this point, the next thread in the ready queue (if there is one) is allowed to take control of the lock. O thread invocado Wait permanece na fila de espera até que um thread que mantém o bloqueio seja invocado PulseAll ou seja o próximo na fila e um thread que mantém as invocações de bloqueio Pulse .The thread that invoked Wait remains in the waiting queue until either a thread that holds the lock invokes PulseAll, or it is the next in the queue and a thread that holds the lock invokes Pulse. No entanto, se millisecondsTimeout decorrer antes de outro thread invocar o Pulse método ou o objeto PulseAll , o thread original será movido para a fila pronta para reobter o bloqueio.However, if millisecondsTimeout elapses before another thread invokes this object's Pulse or PulseAll method, the original thread is moved to the ready queue in order to regain the lock.

Observação

Se Infinite for especificado para o millisecondsTimeout parâmetro, esse método será bloqueado indefinidamente, a menos que o detentor das chamadas de bloqueio Pulse ou PulseAll .If Infinite is specified for the millisecondsTimeout parameter, this method blocks indefinitely unless the holder of the lock calls Pulse or PulseAll. Se millisecondsTimeout for igual a 0, o thread que chamará Wait libera o bloqueio e, em seguida, entrará imediatamente na fila pronta para reobter o bloqueio.If millisecondsTimeout equals 0, the thread that calls Wait releases the lock and then immediately enters the ready queue in order to regain the lock.

O chamador é executado Wait uma vez, independentemente do número de vezes que foi Enter invocado para o objeto especificado.The caller executes Wait once, regardless of the number of times Enter has been invoked for the specified object. Conceitualmente, o Wait método armazena o número de vezes que o chamador é invocado Enter no objeto e invoca Exit quantas vezes forem necessárias para liberar totalmente o objeto bloqueado.Conceptually, the Wait method stores the number of times the caller invoked Enter on the object and invokes Exit as many times as necessary to fully release the locked object. Em seguida, o chamador é bloqueado enquanto aguarda a reaquisição do objeto.The caller then blocks while waiting to reacquire the object. Quando o chamador readquire o bloqueio, o sistema chama quantas Enter vezes forem necessárias para restaurar a contagem salva Enter para o chamador.When the caller reacquires the lock, the system calls Enter as many times as necessary to restore the saved Enter count for the caller. Chamar Wait libera o bloqueio somente para o objeto especificado; se o chamador for o proprietário de bloqueios em outros objetos, esses bloqueios não serão liberados.Calling Wait releases the lock for the specified object only; if the caller is the owner of locks on other objects, these locks are not released.

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.A synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

Os Pulse PulseAll métodos, e Wait devem ser invocados de dentro de um bloco de código sincronizado.The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Os comentários para o Pulse método explicam o que acontece se Pulse for chamado quando nenhum thread estiver aguardando.The remarks for the Pulse method explain what happens if Pulse is called when no threads are waiting.

Anotações na saída do contextoNotes on Exiting the Context

O exitContext parâmetro não tem nenhum efeito, a menos que o Wait método seja chamado de dentro de um contexto gerenciado não padrão.TheexitContext parameter has no effect unless the Wait method is called from inside a nondefault managed context. Isso pode acontecer se o thread estiver dentro de uma chamada para uma instância de uma classe derivada de ContextBoundObject .This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Mesmo que você esteja executando um método em uma classe que não seja 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.Even if you are currently executing a method on a class that is not derived from ContextBoundObject, like String, you can be in a nondefault context if a ContextBoundObject is on your stack in the current application domain.

Quando seu código está sendo executado em um contexto não padrão, especificar true for exitContext faz com que o thread saia do contexto gerenciado não padrão (ou seja, para fazer a transição para o contexto padrão) antes de executar o Wait método.When your code is executing in a nondefault context, specifying true for exitContext causes the thread to exit the nondefault managed context (that is, to transition to the default context) before executing the Wait method. Ele retorna ao contexto não padrão original depois que a chamada para o Wait método é concluída.It returns to the original nondefault context after the call to the Wait method completes.

Isso pode ser útil quando a classe vinculada ao contexto tem o SynchronizationAttribute atributo aplicado.This can be useful when the context-bound class has the SynchronizationAttribute attribute applied. Nesse caso, todas as chamadas para membros da classe são sincronizadas automaticamente e o domínio de sincronização é o corpo completo do código para a classe.In that case, all calls to members of the class are automatically synchronized, and the synchronization domain is the entire body of code for the class. Se o código na pilha de chamadas de um membro chamar o Wait método e especificar true for exitContext , o thread sairá do domínio de sincronização, permitindo que um thread bloqueado em uma chamada para qualquer membro do objeto continue.If code in the call stack of a member calls the Wait method and specifies true for exitContext, the thread exits the synchronization domain, allowing a thread that is blocked on a call to any member of the object to proceed. Quando o Wait método retorna, o thread que fez a chamada deve aguardar para inserir novamente o domínio de sincronização.When the Wait method returns, the thread that made the call must wait to reenter the synchronization domain.

Veja também

Aplica-se a

Wait(Object)

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock.

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 no qual aguardar.The object on which to wait.

Retornos

Boolean

true se a chamada foi retornada porque o chamador adquiriu o bloqueio novamente para o objeto especificado.true if the call returned because the caller reacquired the lock for the specified object. Este método não será retornado se o bloqueio não for adquirido novamente.This method does not return if the lock is not reacquired.

Exceções

O parâmetro obj é null.The obj parameter is null.

O thread de chamada não é proprietário do bloqueio do objeto especificado.The calling thread does not own the lock for the specified object.

O thread que invoca Wait é posteriormente interrompido do estado de espera.The thread that invokes Wait is later interrupted from the waiting state. Isso acontece quando outro thread chama o método Interrupt() desse thread.This happens when another thread calls this thread's Interrupt() method.

Comentários

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.The thread that currently owns the lock on the specified object invokes this method in order to release the object so that another thread can access it. O chamador é bloqueado enquanto aguarda a reaquisição do bloqueio.The caller is blocked while waiting to reacquire the lock. Esse método é chamado quando o chamador precisa aguardar uma alteração de estado que ocorrerá como resultado de operações de outro thread.This method is called when the caller needs to wait for a state change that will occur as a result of another thread's operations.

Quando um thread chama Wait , ele libera o bloqueio no objeto e insere a fila de espera do objeto.When a thread calls Wait, it releases the lock on the object and enters the object's waiting queue. O próximo thread na fila pronta do objeto (se houver) adquire o bloqueio e tem um uso exclusivo do objeto.The next thread in the object's ready queue (if there is one) acquires the lock and has exclusive use of the object. Todos os threads que chamam Wait permanecem na fila de espera até receberem um sinal de Pulse ou PulseAll , enviados pelo proprietário do bloqueio.All threads that call Wait remain in the waiting queue until they receive a signal from Pulse or PulseAll, sent by the owner of the lock. Se Pulse for enviado, somente o thread no início da fila de espera será afetado.If Pulse is sent, only the thread at the head of the waiting queue is affected. Se PulseAll for enviado, todos os threads que estão aguardando o objeto serão afetados.If PulseAll is sent, all threads that are waiting for the object are affected. Quando o sinal é recebido, um ou mais threads deixam a fila de espera e entram na fila pronta.When the signal is received, one or more threads leave the waiting queue and enter the ready queue. Um thread na fila pronta tem permissão para readquirir o bloqueio.A thread in the ready queue is permitted to reacquire the lock.

Esse método retorna quando o thread de chamada readquire o bloqueio no objeto.This method returns when the calling thread reacquires the lock on the object. Observe que esse método bloqueia indefinidamente se o detentor do bloqueio não chama Pulse ou PulseAll .Note that this method blocks indefinitely if the holder of the lock does not call Pulse or PulseAll.

O chamador é executado Wait uma vez, independentemente do número de vezes que foi Enter invocado para o objeto especificado.The caller executes Wait once, regardless of the number of times Enter has been invoked for the specified object. Conceitualmente, o Wait método armazena o número de vezes que o chamador é invocado Enter no objeto e invoca Exit quantas vezes forem necessárias para liberar totalmente o objeto bloqueado.Conceptually, the Wait method stores the number of times the caller invoked Enter on the object and invokes Exit as many times as necessary to fully release the locked object. Em seguida, o chamador é bloqueado enquanto aguarda a reaquisição do objeto.The caller then blocks while waiting to reacquire the object. Quando o chamador readquire o bloqueio, o sistema chama quantas Enter vezes forem necessárias para restaurar a contagem salva Enter para o chamador.When the caller reacquires the lock, the system calls Enter as many times as necessary to restore the saved Enter count for the caller. Chamar Wait libera o bloqueio somente para o objeto especificado; se o chamador for o proprietário de bloqueios em outros objetos, esses bloqueios não serão liberados.Calling Wait releases the lock for the specified object only; if the caller is the owner of locks on other objects, these locks are not released.

Observe que 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.Note that a synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

Os Pulse PulseAll métodos, e Wait devem ser invocados de dentro de um bloco de código sincronizado.The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Os comentários para o Pulse método explicam o que acontece se Pulse for chamado quando nenhum thread estiver aguardando.The remarks for the Pulse method explain what happens if Pulse is called when no threads are waiting.

Veja também

Aplica-se a

Wait(Object, Int32)

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock. Se o intervalo de tempo limite especificado transcorrer, o thread entrará na fila pronta.If the specified time-out interval elapses, the thread enters the ready queue.

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 no qual aguardar.The object on which to wait.

millisecondsTimeout
Int32

O número de milissegundos de espera antes que o thread entre na fila pronta.The number of milliseconds to wait before the thread enters the ready queue.

Retornos

Boolean

true se o bloqueio foi readquirido antes de ter decorrido o tempo especificado e false se o bloqueio foi readquirido depois que o tempo especificado foi decorrido.true if the lock was reacquired before the specified time elapsed; false if the lock was reacquired after the specified time elapsed. O método não retorna até que o bloqueio seja readquirido.The method does not return until the lock is reacquired.

Exceções

O parâmetro obj é null.The obj parameter is null.

O thread de chamada não é proprietário do bloqueio do objeto especificado.The calling thread does not own the lock for the specified object.

O thread que invoca Wait é posteriormente interrompido do estado de espera.The thread that invokes Wait is later interrupted from the waiting state. Isso acontece quando outro thread chama o método Interrupt() desse thread.This happens when another thread calls this thread's Interrupt() method.

O valor do parâmetro millisecondsTimeout é negativo e não é igual a Infinite.The value of the millisecondsTimeout parameter is negative, and is not equal to Infinite.

Comentários

Esse método não retorna até que ele readquira um bloqueio exclusivo no obj parâmetro.This method does not return until it reacquires an exclusive lock on the obj parameter.

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.The thread that currently owns the lock on the specified object invokes this method in order to release the object so that another thread can access it. O chamador é bloqueado enquanto aguarda a reaquisição do bloqueio.The caller is blocked while waiting to reacquire the lock. Esse método é chamado quando o chamador precisa aguardar uma alteração de estado que ocorrerá como resultado de operações de outro thread.This method is called when the caller needs to wait for a state change that will occur as a result of another thread's operations.

O tempo limite garante que o thread atual não bloqueie indefinidamente se outro thread liberar o bloqueio sem primeiro chamar o Pulse método ou PulseAll .The time-out ensures that the current thread does not block indefinitely if another thread releases the lock without first calling the Pulse or PulseAll method. Ele também move o thread para a fila pronta, ignorando outros threads à frente dele na fila de espera, para que ele possa readquirir o bloqueio mais cedo.It also moves the thread to the ready queue, bypassing other threads ahead of it in the wait queue, so that it can reacquire the lock sooner. O thread pode testar o valor de retorno do Wait método para determinar se ele readquiriu o bloqueio antes do tempo limite. O thread pode avaliar as condições que o fizeram para entrar na espera e, se necessário, chamar o Wait método novamente.The thread can test the return value of the Wait method to determine whether it reacquired the lock prior to the time-out. The thread can evaluate the conditions that caused it to enter the wait, and if necessary call the Wait method again.

Quando um thread chama Wait , ele libera o bloqueio no objeto e insere a fila de espera do objeto.When a thread calls Wait, it releases the lock on the object and enters the object's waiting queue. O próximo thread na fila pronta do objeto (se houver) adquire o bloqueio e tem um uso exclusivo do objeto.The next thread in the object's ready queue (if there is one) acquires the lock and has exclusive use of the object. O thread invocado Wait permanece na fila de espera até que um thread que mantém o bloqueio seja invocado PulseAll ou seja o próximo na fila e um thread que mantém as invocações de bloqueio Pulse .The thread that invoked Wait remains in the waiting queue until either a thread that holds the lock invokes PulseAll, or it is the next in the queue and a thread that holds the lock invokes Pulse. No entanto, se millisecondsTimeout decorrer antes de outro thread invocar o Pulse método ou o objeto PulseAll , o thread original será movido para a fila pronta para reobter o bloqueio.However, if millisecondsTimeout elapses before another thread invokes this object's Pulse or PulseAll method, the original thread is moved to the ready queue in order to regain the lock.

Observação

Se Infinite for especificado para o millisecondsTimeout parâmetro, esse método será bloqueado indefinidamente, a menos que o detentor das chamadas de bloqueio Pulse ou PulseAll .If Infinite is specified for the millisecondsTimeout parameter, this method blocks indefinitely unless the holder of the lock calls Pulse or PulseAll. Se millisecondsTimeout for igual a 0, o thread que chamará Wait libera o bloqueio e, em seguida, entrará imediatamente na fila pronta para reobter o bloqueio.If millisecondsTimeout equals 0, the thread that calls Wait releases the lock and then immediately enters the ready queue in order to regain the lock.

O chamador é executado Wait uma vez, independentemente do número de vezes que foi Enter invocado para o objeto especificado.The caller executes Wait once, regardless of the number of times Enter has been invoked for the specified object. Conceitualmente, o Wait método armazena o número de vezes que o chamador é invocado Enter no objeto e invoca Exit quantas vezes forem necessárias para liberar totalmente o objeto bloqueado.Conceptually, the Wait method stores the number of times the caller invoked Enter on the object and invokes Exit as many times as necessary to fully release the locked object. Em seguida, o chamador é bloqueado enquanto aguarda a reaquisição do objeto.The caller then blocks while waiting to reacquire the object. Quando o chamador readquire o bloqueio, o sistema chama quantas Enter vezes forem necessárias para restaurar a contagem salva Enter para o chamador.When the caller reacquires the lock, the system calls Enter as many times as necessary to restore the saved Enter count for the caller. Chamar Wait libera o bloqueio somente para o objeto especificado; se o chamador for o proprietário de bloqueios em outros objetos, esses bloqueios não serão liberados.Calling Wait releases the lock for the specified object only; if the caller is the owner of locks on other objects, these locks are not released.

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.A synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

Os Pulse PulseAll métodos, e Wait devem ser invocados de dentro de um bloco de código sincronizado.The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Os comentários para o Pulse método explicam o que acontece se Pulse for chamado quando nenhum thread estiver aguardando.The remarks for the Pulse method explain what happens if Pulse is called when no threads are waiting.

Veja também

Aplica-se a

Wait(Object, TimeSpan)

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock. Se o intervalo de tempo limite especificado transcorrer, o thread entrará na fila pronta.If the specified time-out interval elapses, the thread enters the ready queue.

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 no qual aguardar.The object on which to wait.

timeout
TimeSpan

Um TimeSpan que representa o período de tempo de espera antes que o thread entre na fila pronta.A TimeSpan representing the amount of time to wait before the thread enters the ready queue.

Retornos

Boolean

true se o bloqueio foi readquirido antes de ter decorrido o tempo especificado e false se o bloqueio foi readquirido depois que o tempo especificado foi decorrido.true if the lock was reacquired before the specified time elapsed; false if the lock was reacquired after the specified time elapsed. O método não retorna até que o bloqueio seja readquirido.The method does not return until the lock is reacquired.

Exceções

O parâmetro obj é null.The obj parameter is null.

O thread de chamada não é proprietário do bloqueio do objeto especificado.The calling thread does not own the lock for the specified object.

O thread que invoca Wait é posteriormente interrompido do estado de espera.The thread that invokes Wait is later interrupted from the waiting state. Isso acontece quando outro thread chama o método Interrupt() desse thread.This happens when another thread calls this thread's Interrupt() method.

O valor do parâmetro timeout em milissegundos é negativo e não representa Infinite (-1 milissegundos) ou é maior que MaxValue.The value of the timeout parameter in milliseconds is negative and does not represent Infinite (-1 millisecond), or is greater than MaxValue.

Comentários

Esse método não retorna até que ele readquira um bloqueio exclusivo no obj parâmetro.This method does not return until it reacquires an exclusive lock on the obj parameter.

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.The thread that currently owns the lock on the specified object invokes this method in order to release the object so that another thread can access it. O chamador é bloqueado enquanto aguarda a reaquisição do bloqueio.The caller is blocked while waiting to reacquire the lock. Esse método é chamado quando o chamador precisa aguardar uma alteração de estado que ocorrerá como resultado de operações de outro thread.This method is called when the caller needs to wait for a state change that will occur as a result of another thread's operations.

O tempo limite garante que o thread atual não bloqueie indefinidamente se outro thread liberar o bloqueio sem primeiro chamar o Pulse método ou PulseAll .The time-out ensures that the current thread does not block indefinitely if another thread releases the lock without first calling the Pulse or PulseAll method. Ele também move o thread para a fila pronta, ignorando outros threads à frente dele na fila de espera, para que ele possa readquirir o bloqueio mais cedo.It also moves the thread to the ready queue, bypassing other threads ahead of it in the wait queue, so that it can reacquire the lock sooner. O thread pode testar o valor de retorno do Wait método para determinar se ele readquiriu o bloqueio antes do tempo limite. O thread pode avaliar as condições que o fizeram para entrar na espera e, se necessário, chamar o Wait método novamente.The thread can test the return value of the Wait method to determine whether it reacquired the lock prior to the time-out. The thread can evaluate the conditions that caused it to enter the wait, and if necessary call the Wait method again.

Quando um thread chama Wait , ele libera o bloqueio no objeto e insere a fila de espera do objeto.When a thread calls Wait, it releases the lock on the object and enters the object's waiting queue. O próximo thread na fila pronta do objeto (se houver) adquire o bloqueio e tem um uso exclusivo do objeto.The next thread in the object's ready queue (if there is one) acquires the lock and has exclusive use of the object. O thread invocado Wait permanece na fila de espera até que um thread que mantém o bloqueio seja invocado PulseAll ou seja o próximo na fila e um thread que mantém as invocações de bloqueio Pulse .The thread that invoked Wait remains in the waiting queue until either a thread that holds the lock invokes PulseAll, or it is the next in the queue and a thread that holds the lock invokes Pulse. No entanto, se timeout decorrer antes de outro thread invocar o Pulse método ou o objeto PulseAll , o thread original será movido para a fila pronta para reobter o bloqueio.However, if timeout elapses before another thread invokes this object's Pulse or PulseAll method, the original thread is moved to the ready queue in order to regain the lock.

Observação

Se um TimeSpan representando-1 milissegundo for especificado para o timeout parâmetro, esse método bloqueará indefinidamente, a menos que o detentor das chamadas de bloqueio Pulse ou PulseAll .If a TimeSpan representing -1 millisecond is specified for the timeout parameter, this method blocks indefinitely unless the holder of the lock calls Pulse or PulseAll. Se timeout for 0 milissegundos, o thread que chama Wait libera o bloqueio e, em seguida, entra imediatamente na fila pronta para reobter o bloqueio.If timeout is 0 milliseconds, the thread that calls Wait releases the lock and then immediately enters the ready queue in order to regain the lock.

O chamador é executado Wait uma vez, independentemente do número de vezes que foi Enter invocado para o objeto especificado.The caller executes Wait once, regardless of the number of times Enter has been invoked for the specified object. Conceitualmente, o Wait método armazena o número de vezes que o chamador é invocado Enter no objeto e invoca Exit quantas vezes forem necessárias para liberar totalmente o objeto bloqueado.Conceptually, the Wait method stores the number of times the caller invoked Enter on the object and invokes Exit as many times as necessary to fully release the locked object. Em seguida, o chamador é bloqueado enquanto aguarda a reaquisição do objeto.The caller then blocks while waiting to reacquire the object. Quando o chamador readquire o bloqueio, o sistema chama quantas Enter vezes forem necessárias para restaurar a contagem salva Enter para o chamador.When the caller reacquires the lock, the system calls Enter as many times as necessary to restore the saved Enter count for the caller. Chamar Wait libera o bloqueio somente para o objeto especificado; se o chamador for o proprietário de bloqueios em outros objetos, esses bloqueios não serão liberados.Calling Wait releases the lock for the specified object only; if the caller is the owner of locks on other objects, these locks are not released.

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.A synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

Os Pulse PulseAll métodos, e Wait devem ser invocados de dentro de um bloco de código sincronizado.The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Os comentários para o Pulse método explicam o que acontece se Pulse for chamado quando nenhum thread estiver aguardando.The remarks for the Pulse method explain what happens if Pulse is called when no threads are waiting.

Veja também

Aplica-se a

Wait(Object, TimeSpan, Boolean)

Libera o bloqueio de um objeto e bloqueia o thread atual até que ele adquira o bloqueio novamente.Releases the lock on an object and blocks the current thread until it reacquires the lock. Se o intervalo de tempo limite especificado transcorrer, o thread entrará na fila pronta.If the specified time-out interval elapses, the thread enters the ready queue. Opcionalmente, encerra o domínio de sincronização para o contexto sincronizado antes do tempo de espera e, depois disso, readquire o domínio.Optionally exits the synchronization domain for the synchronized context before the wait and reacquires the domain afterward.

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 no qual aguardar.The object on which to wait.

timeout
TimeSpan

Um TimeSpan que representa o período de tempo de espera antes que o thread entre na fila pronta.A TimeSpan representing the amount of time to wait before the thread enters the ready queue.

exitContext
Boolean

true para sair e readquirir o domínio de sincronização para o contexto (se estiver em um contexto sincronizado) antes do tempo de espera; caso contrário, false.true to exit and reacquire the synchronization domain for the context (if in a synchronized context) before the wait; otherwise, false.

Retornos

Boolean

true se o bloqueio foi readquirido antes de ter decorrido o tempo especificado e false se o bloqueio foi readquirido depois que o tempo especificado foi decorrido.true if the lock was reacquired before the specified time elapsed; false if the lock was reacquired after the specified time elapsed. O método não retorna até que o bloqueio seja readquirido.The method does not return until the lock is reacquired.

Exceções

O parâmetro obj é null.The obj parameter is null.

Wait não é invocado de dentro de um bloco de código sincronizado.Wait is not invoked from within a synchronized block of code.

O thread que invoca Wait é interrompido posteriormente do estado de espera.The thread that invokes Wait is later interrupted from the waiting state. Isso acontece quando outro thread chama o método Interrupt() desse thread.This happens when another thread calls this thread's Interrupt() method.

O parâmetro timeout é negativo e não representa Infinite (-1 milissegundo) ou é maior que MaxValue.The timeout parameter is negative and does not represent Infinite (-1 millisecond), or is greater than MaxValue.

Comentários

Esse método não retorna até que ele readquira um bloqueio exclusivo no obj parâmetro.This method does not return until it reacquires an exclusive lock on the obj parameter.

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.The thread that currently owns the lock on the specified object invokes this method in order to release the object so that another thread can access it. O chamador é bloqueado enquanto aguarda a reaquisição do bloqueio.The caller is blocked while waiting to reacquire the lock. Esse método é chamado quando o chamador precisa aguardar uma alteração de estado que ocorrerá como resultado de operações de outro thread.This method is called when the caller needs to wait for a state change that will occur as a result of another thread's operations.

O tempo limite garante que o thread atual não bloqueie indefinidamente se outro thread liberar o bloqueio sem primeiro chamar o Pulse método ou PulseAll .The time-out ensures that the current thread does not block indefinitely if another thread releases the lock without first calling the Pulse or PulseAll method. Ele também move o thread para a fila pronta, ignorando outros threads à frente dele na fila de espera, para que ele possa readquirir o bloqueio mais cedo.It also moves the thread to the ready queue, bypassing other threads ahead of it in the wait queue, so that it can reacquire the lock sooner. O thread pode testar o valor de retorno do Wait método para determinar se ele readquiriu o bloqueio antes do tempo limite. O thread pode avaliar as condições que o fizeram para entrar na espera e, se necessário, chamar o Wait método novamente.The thread can test the return value of the Wait method to determine whether it reacquired the lock prior to the time-out. The thread can evaluate the conditions that caused it to enter the wait, and if necessary call the Wait method again.

Quando um thread chama Wait , ele libera o bloqueio e entra na fila de espera.When a thread calls Wait, it releases the lock and enters the waiting queue. Neste ponto, o próximo thread na fila pronta (se houver) tem permissão para assumir o controle do bloqueio.At this point, the next thread in the ready queue (if there is one) is allowed to take control of the lock. O thread invocado Wait permanece na fila de espera até que um thread que mantém o bloqueio seja invocado PulseAll ou seja o próximo na fila e um thread que mantém as invocações de bloqueio Pulse .The thread that invoked Wait remains in the waiting queue until either a thread that holds the lock invokes PulseAll, or it is the next in the queue and a thread that holds the lock invokes Pulse. No entanto, se timeout os milissegundos decorrerem antes de outro thread invocar o Pulse método ou o objeto PulseAll , o thread original será movido para a fila pronta para obter o bloqueio novamente.However, if timeout milliseconds elapse before another thread invokes this object's Pulse or PulseAll method, the original thread is moved to the ready queue in order to regain the lock.

Observação

Se um TimeSpan representando-1 milissegundo for especificado para o timeout parâmetro, esse método bloqueará indefinidamente, a menos que o detentor das chamadas de bloqueio Pulse ou PulseAll .If a TimeSpan representing -1 millisecond is specified for the timeout parameter, this method blocks indefinitely unless the holder of the lock calls Pulse or PulseAll. Se timeout for 0 milissegundos, o thread que chama Wait libera o bloqueio e, em seguida, entra imediatamente na fila pronta para reobter o bloqueio.If timeout is 0 milliseconds, the thread that calls Wait releases the lock and then immediately enters the ready queue in order to regain the lock.

O chamador é executado Wait uma vez, independentemente do número de vezes que foi Enter invocado para o objeto especificado.The caller executes Wait once, regardless of the number of times Enter has been invoked for the specified object. Conceitualmente, o Wait método armazena o número de vezes que o chamador é invocado Enter no objeto e invoca Exit quantas vezes forem necessárias para liberar totalmente o objeto bloqueado.Conceptually, the Wait method stores the number of times the caller invoked Enter on the object and invokes Exit as many times as necessary to fully release the locked object. Em seguida, o chamador é bloqueado enquanto aguarda a reaquisição do objeto.The caller then blocks while waiting to reacquire the object. Quando o chamador readquire o bloqueio, o sistema chama quantas Enter vezes forem necessárias para restaurar a contagem salva Enter para o chamador.When the caller reacquires the lock, the system calls Enter as many times as necessary to restore the saved Enter count for the caller. Chamar Wait libera o bloqueio somente para o objeto especificado; se o chamador for o proprietário de bloqueios em outros objetos, esses bloqueios não serão liberados.Calling Wait releases the lock for the specified object only; if the caller is the owner of locks on other objects, these locks are not released.

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.A synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

Os Pulse PulseAll métodos, e Wait devem ser invocados de dentro de um bloco de código sincronizado.The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Os comentários para o Pulse método explicam o que acontece se Pulse for chamado quando nenhum thread estiver aguardando.The remarks for the Pulse method explain what happens if Pulse is called when no threads are waiting.

Anotações na saída do contextoNotes on Exiting the Context

O exitContext parâmetro não tem nenhum efeito, a menos que o Wait método seja chamado de dentro de um contexto gerenciado não padrão.TheexitContext parameter has no effect unless the Wait method is called from inside a nondefault managed context. Isso pode acontecer se o thread estiver dentro de uma chamada para uma instância de uma classe derivada de ContextBoundObject .This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Mesmo que você esteja executando um método em uma classe que não seja 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.Even if you are currently executing a method on a class that is not derived from ContextBoundObject, like String, you can be in a nondefault context if a ContextBoundObject is on your stack in the current application domain.

Quando seu código está sendo executado em um contexto não padrão, especificar true for exitContext faz com que o thread saia do contexto gerenciado não padrão (ou seja, para fazer a transição para o contexto padrão) antes de executar o Wait método.When your code is executing in a nondefault context, specifying true for exitContext causes the thread to exit the nondefault managed context (that is, to transition to the default context) before executing the Wait method. Ele retorna ao contexto não padrão original depois que a chamada para o Wait método é concluída.It returns to the original nondefault context after the call to the Wait method completes.

Isso pode ser útil quando a classe vinculada ao contexto tem o SynchronizationAttribute atributo aplicado.This can be useful when the context-bound class has the SynchronizationAttribute attribute applied. Nesse caso, todas as chamadas para membros da classe são sincronizadas automaticamente e o domínio de sincronização é o corpo completo do código para a classe.In that case, all calls to members of the class are automatically synchronized, and the synchronization domain is the entire body of code for the class. Se o código na pilha de chamadas de um membro chamar o Wait método e especificar true for exitContext , o thread sairá do domínio de sincronização, permitindo que um thread bloqueado em uma chamada para qualquer membro do objeto continue.If code in the call stack of a member calls the Wait method and specifies true for exitContext, the thread exits the synchronization domain, allowing a thread that is blocked on a call to any member of the object to proceed. Quando o Wait método retorna, o thread que fez a chamada deve aguardar para inserir novamente o domínio de sincronização.When the Wait method returns, the thread that made the call must wait to reenter the synchronization domain.

Veja também

Aplica-se a