本主题提供一个示例,说明如何在自定义提供程序回调中设置可取消性。 不能取消以 XAsyncRun 开始的基本异步方法。 在使用自定义提供程序时,可手动添加可取消性支持。 添加支持后,XAsyncCancel 会触发 Cancel
案例。
// Provider callback.
[](XAsyncOp op, const XAsyncProviderData* providerData)
{
switch(op)
{
case XAsyncOp::DoWork:
{
bool canceled = false;
while (true)
{
DWORD waitResult = WaitForSingleObject(callData->cancelEvent, 0);
if (waitResult != WAIT_TIMEOUT)
{
canceled = true;
break;
}
// Continue doing normal work. Should break if completed.
}
if (canceled)
{
XAsyncComplete(providerData->async, E_ABORT, 0);
}
else
{
XAsyncComplete(providerData->async, S_OK, 0);
}
break;
}
case XAsyncOp::Cancel:
SetEvent(callData->cancelEvent);
break;
// Other cases.
}
}
在上述提供程序案例中,可取消性支持是通过使用 Windows 事件添加的。 如果已调用 Cancel
案,并且 DoWork
案以调用至 XAsyncComplete 结束,以及有 E_ABORT
状态的话,则会设定它。 任何方法都可以用于通知取消。 但是,事件是一种用于通知取消的简单方法,它受任何可以被针对的 Microsoft 游戏开发工具包 (GDK) 平台所支持。
若要触发 Cancel
案,请为该任务调用 XAsyncCancel
和异步块,如下所示。
XAsyncCancel(async);