ThreadPool.RegisterWaitForSingleObject Método

Definição

Registra um delegado que está aguardando um WaitHandle.

Sobrecargas

Nome Description
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Registra um delegado para aguardar um WaitHandleinteiro sem sinal de 32 bits para o tempo limite em milissegundos.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Registra um delegado para aguardar um WaitHandle, especificando um TimeSpan valor para o tempo limite.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Registra um delegado para aguardar um WaitHandleinteiro com sinal de 64 bits para o tempo limite em milissegundos.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Registra um delegado para aguardar um WaitHandleinteiro com sinal de 32 bits para o tempo limite em milissegundos.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Importante

Esta API não está em conformidade com CLS.

Registra um delegado para aguardar um WaitHandleinteiro sem sinal de 32 bits para o tempo limite em milissegundos.

public:
 static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::Object ^ state, System::UInt32 millisecondsTimeOutInterval, bool executeOnlyOnce);
[System.CLSCompliant(false)]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce);
[<System.CLSCompliant(false)>]
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * uint32 * bool -> System.Threading.RegisteredWaitHandle
Public Shared Function RegisterWaitForSingleObject (waitObject As WaitHandle, callBack As WaitOrTimerCallback, state As Object, millisecondsTimeOutInterval As UInteger, executeOnlyOnce As Boolean) As RegisteredWaitHandle

Parâmetros

waitObject
WaitHandle

O WaitHandle registro a ser registrado. Use um WaitHandle diferente de Mutex.

callBack
WaitOrTimerCallback

O WaitOrTimerCallback delegado a ser chamado quando o waitObject parâmetro é sinalizado.

state
Object

O objeto passado para o delegado.

millisecondsTimeOutInterval
UInt32

O tempo limite em milissegundos. Se o millisecondsTimeOutInterval parâmetro for 0 (zero), a função testará o estado do objeto e retornará imediatamente. Se millisecondsTimeOutInterval for -1, o intervalo de tempo limite da função nunca será decorrido.

executeOnlyOnce
Boolean

true para indicar que o thread não aguardará mais o waitObject parâmetro depois que o delegado tiver sido chamado; false para indicar que o temporizador é redefinido sempre que a operação de espera for concluída até que a espera não seja registrada.

Retornos

O RegisteredWaitHandle que pode ser usado para cancelar a operação de espera registrada.

Atributos

Exceções

O millisecondsTimeOutInterval parâmetro é menor que -1.

Exemplos

O exemplo a seguir mostra como usar o RegisterWaitForSingleObject método para executar um método de retorno de chamada especificado quando um identificador de espera especificado é sinalizado. Neste exemplo, o método de retorno de chamada é WaitProc, e o identificador de espera é um AutoResetEvent.

O exemplo define uma TaskInfo classe para manter as informações passadas para o retorno de chamada quando ela é executada. O exemplo cria um TaskInfo objeto e atribui a ele alguns dados de cadeia de caracteres. O RegisteredWaitHandle que é retornado pelo RegisterWaitForSingleObject método é atribuído ao campo do TaskInfo objeto para Handle que o método de retorno de chamada tenha acesso ao RegisteredWaitHandle.

Além de TaskInfo especificar como o objeto a ser passado para o método de retorno de chamada, a chamada para o RegisterWaitForSingleObject método especifica o AutoResetEvent que a tarefa aguardará, um WaitOrTimerCallback delegado que representa o WaitProc método de retorno de chamada, um intervalo de tempo limite de um segundo e vários retornos de chamada.

Quando o thread principal sinaliza o AutoResetEvent chamando seu Set método, o WaitOrTimerCallback delegado é invocado. O WaitProc método testa RegisteredWaitHandle para determinar se ocorreu um tempo limite. Se o retorno de chamada foi invocado porque o identificador de espera foi sinalizado, o WaitProc método cancela o registro, RegisteredWaitHandleinterrompendo retornos de chamada adicionais. No caso de um tempo limite, a tarefa continua aguardando. O WaitProc método termina imprimindo uma mensagem no console.

using System;
using System.Threading;

// TaskInfo contains data that will be passed to the callback
// method.
public class TaskInfo {
    public RegisteredWaitHandle Handle = null;
    public string OtherInfo = "default";
}

public class Example {
    public static void Main(string[] args) {
        // The main thread uses AutoResetEvent to signal the
        // registered wait handle, which executes the callback
        // method.
        AutoResetEvent ev = new AutoResetEvent(false);

        TaskInfo ti = new TaskInfo();
        ti.OtherInfo = "First task";
        // The TaskInfo for the task includes the registered wait
        // handle returned by RegisterWaitForSingleObject.  This
        // allows the wait to be terminated when the object has
        // been signaled once (see WaitProc).
        ti.Handle = ThreadPool.RegisterWaitForSingleObject(
            ev,
            new WaitOrTimerCallback(WaitProc),
            ti,
            1000,
            false
        );

        // The main thread waits three seconds, to demonstrate the
        // time-outs on the queued thread, and then signals.
        Thread.Sleep(3100);
        Console.WriteLine("Main thread signals.");
        ev.Set();

        // The main thread sleeps, which should give the callback
        // method time to execute.  If you comment out this line, the
        // program usually ends before the ThreadPool thread can execute.
        Thread.Sleep(1000);
        // If you start a thread yourself, you can wait for it to end
        // by calling Thread.Join.  This option is not available with 
        // thread pool threads.
    }
   
    // The callback method executes when the registered wait times out,
    // or when the WaitHandle (in this case AutoResetEvent) is signaled.
    // WaitProc unregisters the WaitHandle the first time the event is 
    // signaled.
    public static void WaitProc(object state, bool timedOut) {
        // The state object must be cast to the correct type, because the
        // signature of the WaitOrTimerCallback delegate specifies type
        // Object.
        TaskInfo ti = (TaskInfo) state;

        string cause = "TIMED OUT";
        if (!timedOut) {
            cause = "SIGNALED";
            // If the callback method executes because the WaitHandle is
            // signaled, stop future execution of the callback method
            // by unregistering the WaitHandle.
            if (ti.Handle != null)
                ti.Handle.Unregister(null);
        } 

        Console.WriteLine("WaitProc( {0} ) executes on thread {1}; cause = {2}.",
            ti.OtherInfo, 
            Thread.CurrentThread.GetHashCode().ToString(), 
            cause
        );
    }
}
Imports System.Threading

' TaskInfo contains data that will be passed to the callback
' method.
Public Class TaskInfo
    public Handle As RegisteredWaitHandle = Nothing
    public OtherInfo As String = "default"
End Class

Public Class Example

    <MTAThread> _
    Public Shared Sub Main()
        ' The main thread uses AutoResetEvent to signal the
        ' registered wait handle, which executes the callback
        ' method.
        Dim ev As New AutoResetEvent(false)

        Dim ti As New TaskInfo()
        ti.OtherInfo = "First task"
        ' The TaskInfo for the task includes the registered wait
        ' handle returned by RegisterWaitForSingleObject.  This
        ' allows the wait to be terminated when the object has
        ' been signaled once (see WaitProc).
        ti.Handle = ThreadPool.RegisterWaitForSingleObject( _
            ev, _
            New WaitOrTimerCallback(AddressOf WaitProc), _
            ti, _
            1000, _
            false _
        )

        ' The main thread waits about three seconds, to demonstrate 
        ' the time-outs on the queued task, and then signals.
        Thread.Sleep(3100)
        Console.WriteLine("Main thread signals.")
        ev.Set()

        ' The main thread sleeps, which should give the callback
        ' method time to execute.  If you comment out this line, the
        ' program usually ends before the ThreadPool thread can execute.
        Thread.Sleep(1000)
        ' If you start a thread yourself, you can wait for it to end
        ' by calling Thread.Join.  This option is not available with 
        ' thread pool threads.
    End Sub
   
    ' The callback method executes when the registered wait times out,
    ' or when the WaitHandle (in this case AutoResetEvent) is signaled.
    ' WaitProc unregisters the WaitHandle the first time the event is 
    ' signaled.
    Public Shared Sub WaitProc(state As Object, timedOut As Boolean)
        ' The state object must be cast to the correct type, because the
        ' signature of the WaitOrTimerCallback delegate specifies type
        ' Object.
        Dim ti As TaskInfo = CType(state, TaskInfo)

        Dim cause As String = "TIMED OUT"
        If Not timedOut Then
            cause = "SIGNALED"
            ' If the callback method executes because the WaitHandle is
            ' signaled, stop future execution of the callback method
            ' by unregistering the WaitHandle.
            If Not ti.Handle Is Nothing Then
                ti.Handle.Unregister(Nothing)
            End If
        End If 

        Console.WriteLine("WaitProc( {0} ) executes on thread {1}; cause = {2}.", _
            ti.OtherInfo, _
            Thread.CurrentThread.GetHashCode().ToString(), _
            cause _
        )
    End Sub
End Class

Comentários

Quando terminar de usar o RegisteredWaitHandle que é retornado por esse método, chame seu RegisteredWaitHandle.Unregister método para liberar referências ao identificador de espera. Recomendamos que você sempre chame o RegisteredWaitHandle.Unregister método, mesmo que especifique true para executeOnlyOnce. A coleta de lixo funcionará com mais eficiência se você chamar o RegisteredWaitHandle.Unregister método em vez de depender do finalizador do identificador de espera registrado.

O RegisterWaitForSingleObject método enfileira o delegado especificado para o pool de threads. Um thread de trabalho executará o delegado quando ocorrer um dos seguintes procedimentos:

  • O objeto especificado está no estado sinalizado.
  • O intervalo de tempo limite decorrido.

O RegisterWaitForSingleObject método verifica o estado atual do objeto WaitHandleespecificado. Se o estado do objeto não estiver assinado, o método registrará uma operação de espera. A operação de espera é executada por um thread do pool de threads. O delegado é executado por um thread de trabalho quando o estado do objeto é sinalizado ou o intervalo de tempo limite decorrido. Se o timeOutInterval parâmetro não for 0 (zero) e o executeOnlyOnce parâmetro for false, o temporizador será redefinido sempre que o evento for sinalizado ou o intervalo de tempo limite decorrido.

Importante

Usar um Mutex para waitObject não fornece exclusão mútua para os retornos de chamada porque a API de Windows subjacente usa o sinalizador padrão WT_EXECUTEDEFAULT, portanto, cada retorno de chamada é expedido em um thread separado do pool de threads. Em vez de um Mutex, use um Semaphore com uma contagem máxima de 1.

Para cancelar a operação de espera, chame o RegisteredWaitHandle.Unregister método.

O thread de espera usa a função Win32 WaitForMultipleObjects para monitorar operações de espera registradas. Portanto, se você precisar usar o mesmo identificador do sistema operacional nativo em várias chamadas, RegisterWaitForSingleObjectdeverá duplicar o identificador usando a função Win32 DuplicateHandle . Observe que você não deve pulsar um objeto de evento passado para RegisterWaitForSingleObject, porque o thread de espera pode não detectar que o evento é sinalizado antes de ser redefinido.

Antes de retornar, a função modifica o estado de alguns tipos de objetos de sincronização. A modificação ocorre apenas para o objeto cujo estado sinalizado fez com que a condição de espera fosse atendida. Por exemplo, a contagem de um semáforo é reduzida em um.

Confira também

Aplica-se a

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Registra um delegado para aguardar um WaitHandle, especificando um TimeSpan valor para o tempo limite.

public:
 static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::Object ^ state, TimeSpan timeout, bool executeOnlyOnce);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, TimeSpan timeout, bool executeOnlyOnce);
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * TimeSpan * bool -> System.Threading.RegisteredWaitHandle
Public Shared Function RegisterWaitForSingleObject (waitObject As WaitHandle, callBack As WaitOrTimerCallback, state As Object, timeout As TimeSpan, executeOnlyOnce As Boolean) As RegisteredWaitHandle

Parâmetros

waitObject
WaitHandle

O WaitHandle registro a ser registrado. Use um WaitHandle diferente de Mutex.

callBack
WaitOrTimerCallback

O WaitOrTimerCallback delegado a ser chamado quando o waitObject parâmetro é sinalizado.

state
Object

O objeto passado para o delegado.

timeout
TimeSpan

O tempo limite representado por um TimeSpan. Se timeout for 0 (zero), a função testará o estado do objeto e retornará imediatamente. Se timeout for -1, o intervalo de tempo limite da função nunca será decorrido.

executeOnlyOnce
Boolean

true para indicar que o thread não aguardará mais o waitObject parâmetro depois que o delegado tiver sido chamado; false para indicar que o temporizador é redefinido sempre que a operação de espera for concluída até que a espera não seja registrada.

Retornos

O RegisteredWaitHandle que encapsula o identificador nativo.

Exceções

O timeout parâmetro é menor que -1.

O timeout parâmetro é maior que Int32.MaxValue.

Comentários

Quando terminar de usar o RegisteredWaitHandle que é retornado por esse método, chame seu RegisteredWaitHandle.Unregister método para liberar referências ao identificador de espera. Recomendamos que você sempre chame o RegisteredWaitHandle.Unregister método, mesmo que especifique true para executeOnlyOnce. A coleta de lixo funcionará com mais eficiência se você chamar o RegisteredWaitHandle.Unregister método em vez de depender do finalizador do identificador de espera registrado.

O RegisterWaitForSingleObject método enfileira o delegado especificado para o pool de threads. Um thread de trabalho executará o delegado quando ocorrer um dos seguintes procedimentos:

  • O objeto especificado está no estado sinalizado.
  • O intervalo de tempo limite decorrido.

O RegisterWaitForSingleObject método verifica o estado atual do objeto WaitHandleespecificado. Se o estado do objeto não estiver assinado, o método registrará uma operação de espera. A operação de espera é executada por um thread do pool de threads. O delegado é executado por um thread de trabalho quando o estado do objeto é sinalizado ou o intervalo de tempo limite decorrido. Se o timeOutInterval parâmetro não for 0 (zero) e o executeOnlyOnce parâmetro for false, o temporizador será redefinido sempre que o evento for sinalizado ou o intervalo de tempo limite decorrido.

Importante

Usar um Mutex para waitObject não fornece exclusão mútua para os retornos de chamada porque a API de Windows subjacente usa o sinalizador padrão WT_EXECUTEDEFAULT, portanto, cada retorno de chamada é expedido em um thread separado do pool de threads. Em vez de um Mutex, use um Semaphore com uma contagem máxima de 1.

Para cancelar a operação de espera, chame o RegisteredWaitHandle.Unregister método.

O thread de espera usa a função Win32 WaitForMultipleObjects para monitorar operações de espera registradas. Portanto, se você precisar usar o mesmo identificador do sistema operacional nativo em várias chamadas, RegisterWaitForSingleObjectdeverá duplicar o identificador usando a função Win32 DuplicateHandle . Observe que você não deve pulsar um objeto de evento passado para RegisterWaitForSingleObject, porque o thread de espera pode não detectar que o evento é sinalizado antes de ser redefinido.

Antes de retornar, a função modifica o estado de alguns tipos de objetos de sincronização. A modificação ocorre apenas para o objeto cujo estado sinalizado fez com que a condição de espera fosse atendida. Por exemplo, a contagem de um semáforo é reduzida em um.

Confira também

Aplica-se a

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Registra um delegado para aguardar um WaitHandleinteiro com sinal de 64 bits para o tempo limite em milissegundos.

public:
 static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::Object ^ state, long millisecondsTimeOutInterval, bool executeOnlyOnce);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, long millisecondsTimeOutInterval, bool executeOnlyOnce);
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * int64 * bool -> System.Threading.RegisteredWaitHandle
Public Shared Function RegisterWaitForSingleObject (waitObject As WaitHandle, callBack As WaitOrTimerCallback, state As Object, millisecondsTimeOutInterval As Long, executeOnlyOnce As Boolean) As RegisteredWaitHandle

Parâmetros

waitObject
WaitHandle

O WaitHandle registro a ser registrado. Use um WaitHandle diferente de Mutex.

callBack
WaitOrTimerCallback

O WaitOrTimerCallback delegado a ser chamado quando o waitObject parâmetro é sinalizado.

state
Object

O objeto passado para o delegado.

millisecondsTimeOutInterval
Int64

O tempo limite em milissegundos. Se o millisecondsTimeOutInterval parâmetro for 0 (zero), a função testará o estado do objeto e retornará imediatamente. Se millisecondsTimeOutInterval for -1, o intervalo de tempo limite da função nunca será decorrido.

executeOnlyOnce
Boolean

true para indicar que o thread não aguardará mais o waitObject parâmetro depois que o delegado tiver sido chamado; false para indicar que o temporizador é redefinido sempre que a operação de espera for concluída até que a espera não seja registrada.

Retornos

O RegisteredWaitHandle que encapsula o identificador nativo.

Exceções

O millisecondsTimeOutInterval parâmetro é menor que -1.

Comentários

Quando terminar de usar o RegisteredWaitHandle que é retornado por esse método, chame seu RegisteredWaitHandle.Unregister método para liberar referências ao identificador de espera. Recomendamos que você sempre chame o RegisteredWaitHandle.Unregister método, mesmo que especifique true para executeOnlyOnce. A coleta de lixo funcionará com mais eficiência se você chamar o RegisteredWaitHandle.Unregister método em vez de depender do finalizador do identificador de espera registrado.

O RegisterWaitForSingleObject método enfileira o delegado especificado para o pool de threads. Um thread de trabalho executará o delegado quando ocorrer um dos seguintes procedimentos:

  • O objeto especificado está no estado sinalizado.
  • O intervalo de tempo limite decorrido.

O RegisterWaitForSingleObject método verifica o estado atual do objeto WaitHandleespecificado. Se o estado do objeto não estiver assinado, o método registrará uma operação de espera. A operação de espera é executada por um thread do pool de threads. O delegado é executado por um thread de trabalho quando o estado do objeto é sinalizado ou o intervalo de tempo limite decorrido. Se o timeOutInterval parâmetro não for 0 (zero) e o executeOnlyOnce parâmetro for false, o temporizador será redefinido sempre que o evento for sinalizado ou o intervalo de tempo limite decorrido.

Importante

Usar um Mutex para waitObject não fornece exclusão mútua para os retornos de chamada porque a API de Windows subjacente usa o sinalizador padrão WT_EXECUTEDEFAULT, portanto, cada retorno de chamada é expedido em um thread separado do pool de threads. Em vez de um Mutex, use um Semaphore com uma contagem máxima de 1.

Para cancelar a operação de espera, chame o RegisteredWaitHandle.Unregister método.

O thread de espera usa a função Win32 WaitForMultipleObjects para monitorar operações de espera registradas. Portanto, se você precisar usar o mesmo identificador do sistema operacional nativo em várias chamadas, RegisterWaitForSingleObjectdeverá duplicar o identificador usando a função Win32 DuplicateHandle . Observe que você não deve pulsar um objeto de evento passado para RegisterWaitForSingleObject, porque o thread de espera pode não detectar que o evento é sinalizado antes de ser redefinido.

Antes de retornar, a função modifica o estado de alguns tipos de objetos de sincronização. A modificação ocorre apenas para o objeto cujo estado sinalizado fez com que a condição de espera fosse atendida. Por exemplo, a contagem de um semáforo é reduzida em um.

Confira também

Aplica-se a

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Registra um delegado para aguardar um WaitHandleinteiro com sinal de 32 bits para o tempo limite em milissegundos.

public:
 static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::Object ^ state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * int * bool -> System.Threading.RegisteredWaitHandle
Public Shared Function RegisterWaitForSingleObject (waitObject As WaitHandle, callBack As WaitOrTimerCallback, state As Object, millisecondsTimeOutInterval As Integer, executeOnlyOnce As Boolean) As RegisteredWaitHandle

Parâmetros

waitObject
WaitHandle

O WaitHandle registro a ser registrado. Use um WaitHandle diferente de Mutex.

callBack
WaitOrTimerCallback

O WaitOrTimerCallback delegado a ser chamado quando o waitObject parâmetro é sinalizado.

state
Object

O objeto que é passado para o delegado.

millisecondsTimeOutInterval
Int32

O tempo limite em milissegundos. Se o millisecondsTimeOutInterval parâmetro for 0 (zero), a função testará o estado do objeto e retornará imediatamente. Se millisecondsTimeOutInterval for -1, o intervalo de tempo limite da função nunca será decorrido.

executeOnlyOnce
Boolean

true para indicar que o thread não aguardará mais o waitObject parâmetro depois que o delegado tiver sido chamado; false para indicar que o temporizador é redefinido sempre que a operação de espera for concluída até que a espera não seja registrada.

Retornos

O RegisteredWaitHandle que encapsula o identificador nativo.

Exceções

O millisecondsTimeOutInterval parâmetro é menor que -1.

Comentários

Quando terminar de usar o RegisteredWaitHandle que é retornado por esse método, chame seu RegisteredWaitHandle.Unregister método para liberar referências ao identificador de espera. Recomendamos que você sempre chame o RegisteredWaitHandle.Unregister método, mesmo que especifique true para executeOnlyOnce. A coleta de lixo funcionará com mais eficiência se você chamar o RegisteredWaitHandle.Unregister método em vez de depender do finalizador do identificador de espera registrado.

O RegisterWaitForSingleObject método enfileira o delegado especificado para o pool de threads. Um thread de trabalho executará o delegado quando ocorrer um dos seguintes procedimentos:

  • O objeto especificado está no estado sinalizado.
  • O intervalo de tempo limite decorrido.

O RegisterWaitForSingleObject método verifica o estado atual do objeto WaitHandleespecificado. Se o estado do objeto não estiver assinado, o método registrará uma operação de espera. A operação de espera é executada por um thread do pool de threads. O delegado é executado por um thread de trabalho quando o estado do objeto é sinalizado ou o intervalo de tempo limite decorrido. Se o timeOutInterval parâmetro não for 0 (zero) e o executeOnlyOnce parâmetro for false, o temporizador será redefinido sempre que o evento for sinalizado ou o intervalo de tempo limite decorrido.

Importante

Usar um Mutex para waitObject não fornece exclusão mútua para os retornos de chamada porque a API de Windows subjacente usa o sinalizador padrão WT_EXECUTEDEFAULT, portanto, cada retorno de chamada é expedido em um thread separado do pool de threads. Em vez de um Mutex, use um Semaphore com uma contagem máxima de 1.

Para cancelar a operação de espera, chame o RegisteredWaitHandle.Unregister método.

O thread de espera usa a função Win32 WaitForMultipleObjects para monitorar operações de espera registradas. Portanto, se você precisar usar o mesmo identificador do sistema operacional nativo em várias chamadas, RegisterWaitForSingleObjectdeverá duplicar o identificador usando a função Win32 DuplicateHandle . Observe que você não deve pulsar um objeto de evento passado para RegisterWaitForSingleObject, porque o thread de espera pode não detectar que o evento é sinalizado antes de ser redefinido.

Antes de retornar, a função modifica o estado de alguns tipos de objetos de sincronização. A modificação ocorre apenas para o objeto cujo estado sinalizado fez com que a condição de espera fosse atendida. Por exemplo, a contagem de um semáforo é reduzida em um.

Confira também

Aplica-se a