ThreadPool.RegisterWaitForSingleObject Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Registra um representante que está aguardando um WaitHandle.
Sobrecargas
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Registra um delegado para aguardar um WaitHandle, especificando um inteiro 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 valor TimeSpan para o tempo limite. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Registra um delegado para esperar um WaitHandle, especificando um inteiro com sinal de 32 bits para o tempo limite em milissegundos. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Registra um delegado para esperar um WaitHandle, especificando um inteiro com sinal de 64 bits para o tempo limite em milissegundos. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)
- Origem:
- ThreadPoolWorkQueue.cs
- Origem:
- ThreadPoolWorkQueue.cs
- Origem:
- ThreadPoolWorkQueue.cs
Importante
Esta API não está em conformidade com CLS.
Registra um delegado para aguardar um WaitHandle, especificando um inteiro 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)]
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject (System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, uint 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)]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject (System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, uint millisecondsTimeOutInterval, bool executeOnlyOnce);
[<System.CLSCompliant(false)>]
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * uint32 * bool -> System.Threading.RegisteredWaitHandle
[<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 a ser registrado. Use um WaitHandle diferente do Mutex.
- callBack
- WaitOrTimerCallback
O delegado WaitOrTimerCallback a ser chamado quando o parâmetro waitObject
é sinalizado.
- state
- Object
O objeto passado ao delegado.
- millisecondsTimeOutInterval
- UInt32
O tempo limite em milissegundos. Se o parâmetro millisecondsTimeOutInterval
for 0 (zero), a função testará o estado do objeto e será imediatamente retornada. Se millisecondsTimeOutInterval
for -1, o intervalo de tempo limite da função nunca expirará.
- executeOnlyOnce
- Boolean
true
para indicar que o thread não esperará o parâmetro waitObject
depois que o delegado for chamado; false
para indicar que o temporizador será reiniciado sempre que a operação de espera for concluída até que o registro da espera seja cancelado.
Retornos
O RegisteredWaitHandle que pode ser usado para cancelar a operação de espera registrada.
- Atributos
Exceções
O parâmetro millisecondsTimeOutInterval
é 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 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 pelo qual 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 main 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 do RegisteredWaitHandle, interrompendo 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 namespace System;
using namespace System::Threading;
// TaskInfo contains data that will be passed to the callback
// method.
public ref class TaskInfo
{
public:
TaskInfo()
{
Handle = nullptr;
OtherInfo = "default";
}
RegisteredWaitHandle^ Handle;
String^ OtherInfo;
};
ref class Example
{
public:
// 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.
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 = static_cast<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 != nullptr )
ti->Handle->Unregister( nullptr );
}
Console::WriteLine( "WaitProc( {0}) executes on thread {1}; cause = {2}.", ti->OtherInfo, Thread::CurrentThread->GetHashCode(), cause );
}
};
int main()
{
// The main thread uses AutoResetEvent to signal the
// registered wait handle, which executes the callback
// method.
AutoResetEvent^ ev = gcnew AutoResetEvent( false );
TaskInfo^ ti = gcnew 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, gcnew WaitOrTimerCallback( Example::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.
return 0;
}
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 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 passa.
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
O uso de um Mutex para waitObject
não fornece exclusão mútua para os retornos de chamada porque a API subjacente do Windows usa o sinalizador padrão WT_EXECUTEDEFAULT
, portanto, cada retorno de chamada é expedido em um thread de pool de threads separado. 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 para RegisterWaitForSingleObject, deverá 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)
- Origem:
- ThreadPoolWorkQueue.cs
- Origem:
- ThreadPoolWorkQueue.cs
- Origem:
- ThreadPoolWorkQueue.cs
Registra um delegado para aguardar um WaitHandle, especificando um valor TimeSpan 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);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject (System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, 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);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject (System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, TimeSpan timeout, bool executeOnlyOnce);
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * TimeSpan * bool -> System.Threading.RegisteredWaitHandle
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 a ser registrado. Use um WaitHandle diferente do Mutex.
- callBack
- WaitOrTimerCallback
O delegado WaitOrTimerCallback a ser chamado quando o parâmetro waitObject
é sinalizado.
- state
- Object
O objeto passado ao delegado.
- timeout
- TimeSpan
O tempo limite representado por um TimeSpan. Se timeout
for 0 (zero), a função testará o estado do objeto e será retornada imediatamente. Se timeout
for -1, o intervalo de tempo limite da função nunca expirará.
- executeOnlyOnce
- Boolean
true
para indicar que o thread não esperará o parâmetro waitObject
depois que o delegado for chamado; false
para indicar que o temporizador será reiniciado sempre que a operação de espera for concluída até que o registro da espera seja cancelado.
Retornos
O RegisteredWaitHandle que encapsula o identificador nativo.
- Atributos
Exceções
O parâmetro timeout
é menor que -1.
O timeout
parâmetro é maior que Int32.MaxValue.
Comentários
Quando terminar de usar o RegisteredWaitHandle 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 passa.
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
O uso de um Mutex para waitObject
não fornece exclusão mútua para os retornos de chamada porque a API subjacente do Windows usa o sinalizador padrão WT_EXECUTEDEFAULT
, portanto, cada retorno de chamada é expedido em um thread de pool de threads separado. 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 para RegisterWaitForSingleObject, deverá 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)
- Origem:
- ThreadPoolWorkQueue.cs
- Origem:
- ThreadPoolWorkQueue.cs
- Origem:
- ThreadPoolWorkQueue.cs
Registra um delegado para esperar um WaitHandle, especificando um inteiro 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);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject (System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, 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);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject (System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * int * bool -> System.Threading.RegisteredWaitHandle
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 a ser registrado. Use um WaitHandle diferente do Mutex.
- callBack
- WaitOrTimerCallback
O delegado WaitOrTimerCallback para chamar quando o parâmetro waitObject
for sinalizado.
- state
- Object
O objeto que é passado para o delegado.
- millisecondsTimeOutInterval
- Int32
O tempo limite em milissegundos. Se o parâmetro millisecondsTimeOutInterval
for 0 (zero), a função testará o estado do objeto e será imediatamente retornada. Se millisecondsTimeOutInterval
for -1, o intervalo de tempo limite da função nunca expirará.
- executeOnlyOnce
- Boolean
true
para indicar que o thread não esperará o parâmetro waitObject
depois que o delegado for chamado; false
para indicar que o temporizador será reiniciado sempre que a operação de espera for concluída até que o registro da espera seja cancelado.
Retornos
O RegisteredWaitHandle que encapsula o identificador nativo.
- Atributos
Exceções
O parâmetro millisecondsTimeOutInterval
é 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 funciona 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 passa.
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 passa. 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 decorrer.
Importante
O uso de um Mutex para waitObject
não fornece exclusão mútua para os retornos de chamada porque a API subjacente do Windows usa o sinalizador padrão WT_EXECUTEDEFAULT
, portanto, cada retorno de chamada é expedido em um thread de pool de threads separado. 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 de sistema operacional nativo em várias chamadas para RegisterWaitForSingleObject, deverá 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)
- Origem:
- ThreadPoolWorkQueue.cs
- Origem:
- ThreadPoolWorkQueue.cs
- Origem:
- ThreadPoolWorkQueue.cs
Registra um delegado para esperar um WaitHandle, especificando um inteiro 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);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject (System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, 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);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject (System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, long millisecondsTimeOutInterval, bool executeOnlyOnce);
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * int64 * bool -> System.Threading.RegisteredWaitHandle
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 a ser registrado. Use um WaitHandle diferente do Mutex.
- callBack
- WaitOrTimerCallback
O delegado WaitOrTimerCallback a ser chamado quando o parâmetro waitObject
é sinalizado.
- state
- Object
O objeto passado ao delegado.
- millisecondsTimeOutInterval
- Int64
O tempo limite em milissegundos. Se o parâmetro millisecondsTimeOutInterval
for 0 (zero), a função testará o estado do objeto e será imediatamente retornada. Se millisecondsTimeOutInterval
for -1, o intervalo de tempo limite da função nunca expirará.
- executeOnlyOnce
- Boolean
true
para indicar que o thread não esperará o parâmetro waitObject
depois que o delegado for chamado; false
para indicar que o temporizador será reiniciado sempre que a operação de espera for concluída até que o registro da espera seja cancelado.
Retornos
O RegisteredWaitHandle que encapsula o identificador nativo.
- Atributos
Exceções
O parâmetro millisecondsTimeOutInterval
é 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 funciona 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 passa.
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 passa. 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 decorrer.
Importante
O uso de um Mutex para waitObject
não fornece exclusão mútua para os retornos de chamada porque a API subjacente do Windows usa o sinalizador padrão WT_EXECUTEDEFAULT
, portanto, cada retorno de chamada é expedido em um thread de pool de threads separado. 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 de sistema operacional nativo em várias chamadas para RegisterWaitForSingleObject, deverá 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.