Set up cancelability example

This topic provides an example of how to set up cancelability in a custom provider callback. Basic async methods that are started with XAsyncRun can't be canceled. Cancelability support can be manually added when you're using a custom provider. After support is added, XAsyncCancel triggers the Cancel case.

// 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.
    }
}

In these provider cases, cancelability support is added by using a Windows event. It's set if the Cancel case is called, and the DoWork case ends with a call to XAsyncComplete with the E_ABORT status. Any method can be used to signal the cancel. However, an event is a simple way to signal the cancel that's supported on any Microsoft Game Development Kit (GDK) platform that can be targeted.

To trigger the Cancel case, call XAsyncCancel with the async block for the task, shown as follows.

XAsyncCancel(async);

See also

XAsyncProvider library overview

Set up custom provider (example)

Set up invocation methods (example)

Set up return data (example)

XAsyncProvider