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 , назначается полю Handle
TaskInfo
объекта , чтобы метод обратного вызова получил доступ к 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 метод, даже если для задано значение true
executeOnlyOnce
. Сборка мусора работает эффективнее при вызове 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 метод, даже если для задано значение true
executeOnlyOnce
. Сборка мусора работает эффективнее при вызове 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 метод, даже если для задано значение true
executeOnlyOnce
. Сборка мусора работает эффективнее при вызове 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 метод, даже если для задано значение true
executeOnlyOnce
. Сборка мусора работает эффективнее при вызове 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, так как поток ожидания может не обнаружить, что событие подается перед сбросом.
Перед возвратом функция изменяет состояние некоторых типов объектов синхронизации. Изменение происходит только для объекта, состояние которого привело к выполнению условия ожидания. Например, количество семафоров уменьшается на единицы.