Поделиться через


ThreadPool.RegisterWaitForSingleObject Метод

Определение

Регистрирует делегат, ожидающий объект WaitHandle.

Перегрузки

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

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 32-разрядного целого числа без знака.

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

Регистрирует делегат для ожидания объекта WaitHandle, задавая значение TimeSpan для времени ожидания.

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

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 32-разрядного целого числа со знаком.

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

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 64-разрядного целого числа со знаком.

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

Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs

Важно!

Этот API несовместим с CLS.

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 32-разрядного целого числа без знака.

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

Параметры

waitObject
WaitHandle

Регистрируемый объект WaitHandle. Используйте объект WaitHandle, отличный от Mutex.

callBack
WaitOrTimerCallback

Делегат WaitOrTimerCallback, который вызывается при получении сигнала объектом, указанным в параметре waitObject.

state
Object

Передаваемый делегату объект.

millisecondsTimeOutInterval
UInt32

Время ожидания в миллисекундах. Если параметр millisecondsTimeOutInterval равен 0 (нулю), функция проверяет состояние объекта и немедленно возвращает значение. Если параметр millisecondsTimeOutInterval равен -1, время ожидания функции никогда не истекает.

executeOnlyOnce
Boolean

Значение true указывает, что после вызова делегата поток не будет ожидать параметр waitObject; значение false указывает, что таймер сбрасывается всякий раз по завершении операции ожидания до тех пор, пока регистрация ожидания не будет отменена.

Возвращаемое значение

Объект RegisteredWaitHandle, который можно использовать для отмены зарегистрированной операции ожидания.

Атрибуты

Исключения

Значение параметра millisecondsTimeOutInterval меньше –1.

Примеры

В следующем примере показано, как использовать RegisterWaitForSingleObject метод для выполнения указанного метода обратного вызова при сигнале указанного дескриптора ожидания. В этом примере метод обратного вызова — WaitProc, а дескриптор ожидания — AutoResetEvent.

В примере определяется TaskInfo класс для хранения сведений, передаваемых обратному вызову при его выполнении. В примере создается TaskInfo объект и присваивается ему строковые данные. Объект RegisteredWaitHandle , возвращаемый методом RegisterWaitForSingleObject , назначается полю HandleTaskInfo объекта , чтобы метод обратного вызова получил доступ к RegisteredWaitHandle.

Помимо указания в качестве объекта, передаваемого TaskInfo методу обратного вызова, вызов RegisterWaitForSingleObject метода указывает AutoResetEvent , что задача будет ожидать, делегат, WaitOrTimerCallback представляющий метод обратного WaitProc вызова, интервал времени ожидания в одну секунду и несколько обратных вызовов.

Когда поток main сообщает , AutoResetEvent вызывая его Set метод, WaitOrTimerCallback вызывается делегат. Метод WaitProc проверяет RegisteredWaitHandle , было ли истекло время ожидания. Если обратный вызов был вызван из-за сигнала дескриптора ожидания, WaitProc метод отменяет RegisteredWaitHandleрегистрацию , останавливая дополнительные обратные вызовы. В случае истечения времени ожидания задача продолжает ждать. Метод WaitProc завершается печатью сообщения в консоль.

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

Комментарии

Завершив использование RegisteredWaitHandle объекта , возвращаемого этим методом, вызовите его RegisteredWaitHandle.Unregister метод , чтобы освободить ссылки на дескриптор ожидания. Рекомендуется всегда вызывать RegisteredWaitHandle.Unregister метод, даже если для задано значение trueexecuteOnlyOnce. Сборка мусора работает эффективнее при вызове RegisteredWaitHandle.Unregister метода , а не в зависимости от метода завершения зарегистрированного дескриптора ожидания.

Метод RegisterWaitForSingleObject помещает указанного делегата в очередь в пул потоков. Рабочий поток выполнит делегат при выполнении одного из следующих действий:

  • Указанный объект находится в состоянии сигнала.
  • Истекает интервал времени ожидания.

Метод RegisterWaitForSingleObject проверяет текущее состояние указанного объекта WaitHandle. Если объект находится в состоянии без знака, метод регистрирует операцию ожидания. Операция ожидания выполняется потоком из пула потоков. Делегат выполняется рабочим потоком, когда состояние объекта становится сигнальным или истекает интервал времени ожидания. timeOutInterval Если параметр не равен 0 (нулю), а executeOnlyOnce параметр равен false, таймер сбрасывается каждый раз, когда подается сигнал о событии или истекает интервал времени ожидания.

Важно!

Mutex Использование для waitObject не обеспечивает взаимного исключения для обратных вызовов, так как базовый API Windows использует флаг по умолчаниюWT_EXECUTEDEFAULT, поэтому каждый обратный вызов отправляется в отдельный поток пула потоков. Вместо Mutexиспользуйте Semaphore с максимальным числом 1.

Чтобы отменить операцию ожидания, вызовите RegisteredWaitHandle.Unregister метод .

Поток ожидания использует функцию Win32 WaitForMultipleObjects для отслеживания зарегистрированных операций ожидания. Таким образом, если необходимо использовать один и тот же дескриптор операционной системы в нескольких вызовах RegisterWaitForSingleObject, необходимо дублировать дескриптор с помощью функции Win32 DuplicateHandle . Обратите внимание, что не следует импульсировать объект события, передаваемый в RegisterWaitForSingleObject, так как поток ожидания может не обнаружить, что событие подается перед сбросом.

Перед возвратом функция изменяет состояние некоторых типов объектов синхронизации. Изменение происходит только для объекта, состояние которого привело к выполнению условия ожидания. Например, количество семафоров уменьшается на единицы.

См. также раздел

Применяется к

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

Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs

Регистрирует делегат для ожидания объекта WaitHandle, задавая значение TimeSpan для времени ожидания.

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

Параметры

waitObject
WaitHandle

Регистрируемый объект WaitHandle. Используйте объект WaitHandle, отличный от Mutex.

callBack
WaitOrTimerCallback

Делегат WaitOrTimerCallback, который вызывается при получении сигнала объектом, указанным в параметре waitObject.

state
Object

Передаваемый делегату объект.

timeout
TimeSpan

Время ожидания, представленное объектом TimeSpan. Если параметр timeout равен 0 (нулю), функция проверяет состояние объекта и немедленно возвращает значение. Если параметр timeout равен -1, время ожидания функции никогда не истекает.

executeOnlyOnce
Boolean

Значение true указывает, что после вызова делегата поток не будет ожидать параметр waitObject; значение false указывает, что таймер сбрасывается всякий раз по завершении операции ожидания до тех пор, пока регистрация ожидания не будет отменена.

Возвращаемое значение

Объект RegisteredWaitHandle, инкапсулирующий собственный дескриптор.

Атрибуты

Исключения

Значение параметра timeout меньше –1.

Параметр timeout больше Int32.MaxValue.

Комментарии

Завершив использование RegisteredWaitHandle объекта , возвращаемого этим методом, вызовите его RegisteredWaitHandle.Unregister метод , чтобы освободить ссылки на дескриптор ожидания. Рекомендуется всегда вызывать RegisteredWaitHandle.Unregister метод, даже если для задано значение trueexecuteOnlyOnce. Сборка мусора работает эффективнее при вызове RegisteredWaitHandle.Unregister метода , а не в зависимости от метода завершения зарегистрированного дескриптора ожидания.

Метод RegisterWaitForSingleObject помещает указанного делегата в очередь в пул потоков. Рабочий поток выполнит делегат при выполнении одного из следующих действий:

  • Указанный объект находится в состоянии сигнала.
  • Истекает интервал времени ожидания.

Метод RegisterWaitForSingleObject проверяет текущее состояние указанного объекта WaitHandle. Если объект находится в состоянии без знака, метод регистрирует операцию ожидания. Операция ожидания выполняется потоком из пула потоков. Делегат выполняется рабочим потоком, когда состояние объекта становится сигнальным или истекает интервал времени ожидания. timeOutInterval Если параметр не равен 0 (нулю), а executeOnlyOnce параметр равен false, таймер сбрасывается каждый раз, когда подается сигнал о событии или истекает интервал времени ожидания.

Важно!

Mutex Использование для waitObject не обеспечивает взаимного исключения для обратных вызовов, так как базовый API Windows использует флаг по умолчаниюWT_EXECUTEDEFAULT, поэтому каждый обратный вызов отправляется в отдельный поток пула потоков. Вместо Mutexиспользуйте Semaphore с максимальным числом 1.

Чтобы отменить операцию ожидания, вызовите RegisteredWaitHandle.Unregister метод .

Поток ожидания использует функцию Win32 WaitForMultipleObjects для отслеживания зарегистрированных операций ожидания. Таким образом, если необходимо использовать один и тот же дескриптор операционной системы в нескольких вызовах RegisterWaitForSingleObject, необходимо дублировать дескриптор с помощью функции Win32 DuplicateHandle . Обратите внимание, что не следует импульсировать объект события, передаваемый в RegisterWaitForSingleObject, так как поток ожидания может не обнаружить, что событие подается перед сбросом.

Перед возвратом функция изменяет состояние некоторых типов объектов синхронизации. Изменение происходит только для объекта, состояние которого привело к выполнению условия ожидания. Например, количество семафоров уменьшается на единицы.

См. также раздел

Применяется к

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

Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 32-разрядного целого числа со знаком.

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

Параметры

waitObject
WaitHandle

Регистрируемый объект WaitHandle. Используйте объект WaitHandle, отличный от Mutex.

callBack
WaitOrTimerCallback

Делегат WaitOrTimerCallback, который вызывается при получении сигнала объектом, указанным в параметре waitObject.

state
Object

Передаваемый делегату объект.

millisecondsTimeOutInterval
Int32

Время ожидания в миллисекундах. Если параметр millisecondsTimeOutInterval равен 0 (нулю), функция проверяет состояние объекта и немедленно возвращает значение. Если параметр millisecondsTimeOutInterval равен -1, время ожидания функции никогда не истекает.

executeOnlyOnce
Boolean

Значение true указывает, что после вызова делегата поток не будет ожидать параметр waitObject; значение false указывает, что таймер сбрасывается всякий раз по завершении операции ожидания до тех пор, пока регистрация ожидания не будет отменена.

Возвращаемое значение

Объект RegisteredWaitHandle, инкапсулирующий собственный дескриптор.

Атрибуты

Исключения

Значение параметра millisecondsTimeOutInterval меньше –1.

Комментарии

Завершив использование RegisteredWaitHandle объекта , возвращаемого этим методом, вызовите его RegisteredWaitHandle.Unregister метод , чтобы освободить ссылки на дескриптор ожидания. Рекомендуется всегда вызывать RegisteredWaitHandle.Unregister метод, даже если для задано значение trueexecuteOnlyOnce. Сборка мусора работает эффективнее при вызове RegisteredWaitHandle.Unregister метода , а не в зависимости от метода завершения зарегистрированного дескриптора ожидания.

Метод RegisterWaitForSingleObject помещает указанного делегата в очередь в пул потоков. Рабочий поток выполнит делегат при выполнении одного из следующих действий:

  • Указанный объект находится в состоянии сигнала.
  • Истекает интервал времени ожидания.

Метод RegisterWaitForSingleObject проверяет текущее состояние указанного объекта WaitHandle. Если объект находится в состоянии без знака, метод регистрирует операцию ожидания. Операция ожидания выполняется потоком из пула потоков. Делегат выполняется рабочим потоком, когда состояние объекта становится сигнальным или истекает интервал времени ожидания. timeOutInterval Если параметр не равен 0 (нулю), а executeOnlyOnce параметр равен false, таймер сбрасывается каждый раз, когда подается сигнал о событии или истекает интервал времени ожидания.

Важно!

Mutex Использование для waitObject не обеспечивает взаимного исключения для обратных вызовов, так как базовый API Windows использует флаг по умолчаниюWT_EXECUTEDEFAULT, поэтому каждый обратный вызов отправляется в отдельный поток пула потоков. Вместо Mutexиспользуйте Semaphore с максимальным числом 1.

Чтобы отменить операцию ожидания, вызовите RegisteredWaitHandle.Unregister метод .

Поток ожидания использует функцию Win32 WaitForMultipleObjects для отслеживания зарегистрированных операций ожидания. Таким образом, если необходимо использовать один и тот же дескриптор операционной системы в нескольких вызовах RegisterWaitForSingleObject, необходимо дублировать дескриптор с помощью функции Win32 DuplicateHandle . Обратите внимание, что не следует импульсировать объект события, передаваемый в RegisterWaitForSingleObject, так как поток ожидания может не обнаружить, что событие подается перед сбросом.

Перед возвратом функция изменяет состояние некоторых типов объектов синхронизации. Изменение происходит только для объекта, состояние которого привело к выполнению условия ожидания. Например, количество семафоров уменьшается на единицы.

См. также раздел

Применяется к

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

Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 64-разрядного целого числа со знаком.

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

Параметры

waitObject
WaitHandle

Регистрируемый объект WaitHandle. Используйте объект WaitHandle, отличный от Mutex.

callBack
WaitOrTimerCallback

Делегат WaitOrTimerCallback, который вызывается при получении сигнала объектом, указанным в параметре waitObject.

state
Object

Передаваемый делегату объект.

millisecondsTimeOutInterval
Int64

Время ожидания в миллисекундах. Если параметр millisecondsTimeOutInterval равен 0 (нулю), функция проверяет состояние объекта и немедленно возвращает значение. Если параметр millisecondsTimeOutInterval равен -1, время ожидания функции никогда не истекает.

executeOnlyOnce
Boolean

Значение true указывает, что после вызова делегата поток не будет ожидать параметр waitObject; значение false указывает, что таймер сбрасывается всякий раз по завершении операции ожидания до тех пор, пока регистрация ожидания не будет отменена.

Возвращаемое значение

Объект RegisteredWaitHandle, инкапсулирующий собственный дескриптор.

Атрибуты

Исключения

Значение параметра millisecondsTimeOutInterval меньше –1.

Комментарии

Завершив использование RegisteredWaitHandle объекта , возвращаемого этим методом, вызовите его RegisteredWaitHandle.Unregister метод , чтобы освободить ссылки на дескриптор ожидания. Рекомендуется всегда вызывать RegisteredWaitHandle.Unregister метод, даже если для задано значение trueexecuteOnlyOnce. Сборка мусора работает эффективнее при вызове RegisteredWaitHandle.Unregister метода , а не в зависимости от метода завершения зарегистрированного дескриптора ожидания.

Метод RegisterWaitForSingleObject помещает указанного делегата в очередь в пул потоков. Рабочий поток выполнит делегат при выполнении одного из следующих действий:

  • Указанный объект находится в состоянии сигнала.
  • Истекает интервал времени ожидания.

Метод RegisterWaitForSingleObject проверяет текущее состояние указанного объекта WaitHandle. Если объект находится в состоянии без знака, метод регистрирует операцию ожидания. Операция ожидания выполняется потоком из пула потоков. Делегат выполняется рабочим потоком, когда состояние объекта становится сигнальным или истекает интервал времени ожидания. timeOutInterval Если параметр не равен 0 (нулю), а executeOnlyOnce параметр равен false, таймер сбрасывается каждый раз, когда подается сигнал о событии или истекает интервал времени ожидания.

Важно!

Mutex Использование для waitObject не обеспечивает взаимного исключения для обратных вызовов, так как базовый API Windows использует флаг по умолчаниюWT_EXECUTEDEFAULT, поэтому каждый обратный вызов отправляется в отдельный поток пула потоков. Вместо Mutexиспользуйте Semaphore с максимальным числом 1.

Чтобы отменить операцию ожидания, вызовите RegisteredWaitHandle.Unregister метод .

Поток ожидания использует функцию Win32 WaitForMultipleObjects для отслеживания зарегистрированных операций ожидания. Таким образом, если необходимо использовать один и тот же дескриптор операционной системы в нескольких вызовах RegisterWaitForSingleObject, необходимо дублировать дескриптор с помощью функции Win32 DuplicateHandle . Обратите внимание, что не следует импульсировать объект события, передаваемый в RegisterWaitForSingleObject, так как поток ожидания может не обнаружить, что событие подается перед сбросом.

Перед возвратом функция изменяет состояние некоторых типов объектов синхронизации. Изменение происходит только для объекта, состояние которого привело к выполнению условия ожидания. Например, количество семафоров уменьшается на единицы.

См. также раздел

Применяется к