System.Threading.ThreadPool.RegisterWaitForSingleObject Method

Registers a delegate to wait for a System.Threading.WaitHandle, specifying a 32-bit unsigned integer for the time-out in milliseconds.


public static RegisteredWaitHandle RegisterWaitForSingleObject (WaitHandle waitObject, WaitOrTimerCallback callBack, object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce)


The System.Threading.WaitHandle to register. Use a System.Threading.WaitHandle other than System.Threading.Mutex.
The System.Threading.WaitOrTimerCallback delegate to call when the waitObject parameter is signaled.
The object passed to the delegate.
The time-out in milliseconds. If the millisecondsTimeOutInterval parameter is 0 (zero), the function tests the object's state and returns immediately. If millisecondsTimeOutInterval is -1, the function's time-out interval never elapses.
true to indicate that the thread will no longer wait on the waitObject parameter after the delegate has been called; false to indicate that the timer is reset every time the wait operation completes until the wait is unregistered.


The System.Threading.RegisteredWaitHandle that can be used to cancel the registered wait operation.


When you are finished using the System.Threading.RegisteredWaitHandle that is returned by this method, call its RegisteredWaitHandle.Unregister(WaitHandle) method to release references to the wait handle. We recommend that you always call the RegisteredWaitHandle.Unregister(WaitHandle) method, even if you specify true for executeOnlyOnce. Garbage collection works more efficiently if you call the RegisteredWaitHandle.Unregister(WaitHandle) method instead of depending on the registered wait handle's finalizer.

The ThreadPool.RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, object, long, bool) method queues the specified delegate to the thread pool. A worker thread will execute the delegate when one of the following occurs:

  • The specified object is in the signaled state.

  • The time-out interval elapses.

The ThreadPool.RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, object, long, bool)method checks the current state of the specified object's System.Threading.WaitHandle. If the object's state is unsignaled, the method registers a wait operation. The wait operation is performed by a thread from the thread pool. The delegate is executed by a worker thread when the object's state becomes signaled or the time-out interval elapses. If the timeOutInterval parameter is not 0 (zero) and the executeOnlyOnce parameter is false, the timer is reset every time the event is signaled or the time-out interval elapses.


Using a System.Threading.Mutex for waitObject does not provide mutual exclusion for the callbacks because the underlying Win32 API uses the default WT_EXECUTEDEFAULT flag, so each callback is dispatched on a separate thread pool thread. Instead of a System.Threading.Mutex, use a System.Threading.Semaphore with a maximum count of 1.

To cancel the wait operation, call the RegisteredWaitHandle.Unregister(WaitHandle) method.

The wait thread uses the Win32 WaitForMultipleObjects function to monitor registered wait operations. Therefore, if you must use the same native operating system handle in multiple calls to ThreadPool.RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, object, long, bool), you must duplicate the handle using the Win32 DuplicateHandle function. Note that you should not pulse an event object passed to ThreadPool.RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, object, long, bool), because the wait thread might not detect that the event is signaled before it is reset.

Before returning, the function modifies the state of some types of synchronization objects. Modification occurs only for the object whose signaled state caused the wait condition to be satisfied. For example, the count of a semaphore is decreased by one.

Version Information

Starting with the .NET Framework version 2.0, the Thread.CurrentPrincipal property value is propagated to worker threads queued using the erload:System.Threading.ThreadPool.RegisterWaitForSingleObject method. In earlier versions, the principal information is not propagated.


Namespace: System.Threading
Assembly: mscorlib (in mscorlib.dll)
Assembly Versions: 1.0.5000.0,,