设置可取消性的示例

本主题提供一个示例,说明如何在自定义提供程序回调中设置可取消性。 不能取消以 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);

另请参阅

XAsyncProvider 库概述

设置自定义提供程序示例(示例)

设置调用方法(示例)

设置返回数据(示例)

XAsyncProvider