UnregisterWaitEx 函数 (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 关联的新回调函数。 但是,可能有挂起的回调函数已排队到工作线程。

在某些情况下,如果 CompletionEventNULL,函数将失败并ERROR_IO_PENDING。 这表示存在未完成的回调函数。 这些回调要么将执行,要么正在执行中。

如果 CompletionEvent 是调用方提供的事件的句柄,则函数可能会成功、失败并 出现ERROR_IO_PENDING或失败并出现其他错误代码。 如果函数成功,或者函数失败并 出现ERROR_IO_PENDING,则调用方应始终等待,直到收到事件关闭事件的信号。 如果函数失败并出现不同的错误代码,则无需等待事件收到关闭事件的信号。

Windowsxp: 如果 CompletionEvent 是调用方提供的事件的句柄,并且函数失败并 出现ERROR_IO_PENDING,则调用方应等待事件收到关闭事件的信号。 从 Windows Vista 开始,此行为已更改。

若要编译使用此函数的应用程序, 请将_WIN32_WINNT 定义为 0x0500 或更高版本。 有关详细信息,请参阅 使用 Windows 标头

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 threadpoollegacyapiset.h (包括 Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

RegisterWaitForSingleObject

同步函数

线程池