Отмена регистрации функцииWaitEx (threadpoollegacyapiset.h)

Отменяет зарегистрированную операцию ожидания, выданную функцией RegisterWaitForSingleObject .

Синтаксис

BOOL UnregisterWaitEx(
  [in]           HANDLE WaitHandle,
  [in, optional] HANDLE CompletionEvent
);

Параметры

[in] WaitHandle

Дескриптор ожидания. Этот дескриптор возвращается функцией RegisterWaitForSingleObject .

[in, optional] CompletionEvent

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

Если этот параметр INVALID_HANDLE_VALUE, функция ожидает завершения всех функций обратного вызова перед возвратом.

Если этот параметр имеет значение NULL, функция помечает таймер для удаления и немедленно возвращает его. Однако большинству вызывающих следует дождаться завершения функции обратного вызова, чтобы они могли выполнить любую необходимую очистку.

Если вызывающий объект предоставляет это событие и функция завершается успешно или функция завершается сбоем с ERROR_IO_PENDING, не закрывайте событие, пока не будет поймечено.

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

Если функция выполняется успешно, возвращается ненулевое значение.

Если функция выполняется неудачно, возвращается нулевое значение. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Комментарии

Вы не можете выполнить блокирующий вызов UnregisterWaitEx из функции обратного вызова для той же операции ожидания. В противном случае обратный вызов будет ожидать завершения. Как правило, блокирующий вызов UnregisterWaitEx создает зависимость между текущим потоком и обратным вызовом, поэтому, чтобы выполнить блокирующий вызов отмены регистрации для другой операции ожидания, необходимо убедиться, что функции обратного вызова не зависят друг от друга и что вторая операция ожидания также не выполняет блокирующий вызов отмены регистрации для первой операции.

Будьте внимательны при выполнении блокирующего вызова UnregisterWaitEx в постоянном потоке. Если операция ожидания, отменяемая регистрация, была создана с помощью WT_EXECUTEINPERSISTENTTHREAD, может возникнуть взаимоблокировка.

После выполнения неблокирующего вызова UnregisterWaitEx новые функции обратного вызова, связанные с WaitHandle , не могут быть помещены в очередь. Однако могут существовать ожидающие функции обратного вызова, уже помещенные в очередь в рабочие потоки.

В некоторых случаях функция завершится сбоем с ERROR_IO_PENDING , если параметр CompletionEvent имеет значение NULL. Это означает, что существуют невыполненные функции обратного вызова. Эти обратные вызовы будут выполняться или находятся в середине выполнения.

Если CompletionEvent является дескриптором события, предоставленного вызывающим, функция может завершиться успешно, завершиться сбоем с ERROR_IO_PENDING или с другим кодом ошибки. Если функция завершается успешно или если функция завершается сбоем с ERROR_IO_PENDING, вызывающий объект должен всегда ждать, пока событие не будет поймечено о закрытии события. Если функция завершается сбоем с другим кодом ошибки, не нужно ждать, пока событие не будет показано, чтобы закрыть событие.

Windows XP: Если CompletionEvent является дескриптором события, предоставленного вызывающим, и функция завершается сбоем с ERROR_IO_PENDING, вызывающий объект должен подождать, пока событие не будет поключено, чтобы закрыть событие. Это поведение изменилось, начиная с Windows Vista.

Чтобы скомпилировать приложение, использующее эту функцию, определите _WIN32_WINNT как 0x0500 или более поздней версии. Дополнительные сведения см. в разделе Использование заголовков Windows.

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header threadpoollegacyapiset.h (включая Windows.h)
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

RegisterWaitForSingleObject

Функции синхронизации

Группировка потоков в пул