> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Exemplo de configuração de cancelabilidade

> Adicione suporte a cancelamento a um provedor assíncrono personalizado sinalizando um evento no caso Cancel e encerrando DoWork com E_ABORT e, em seguida, acione-o com XAsyncCancel.

Este tópico fornece um exemplo de como configurar a cancelabilidade em um retorno de chamada de provedor personalizado. Métodos assíncronos básicos iniciados com [XAsyncRun](https://docs.xbox.com/pt-BR/reference/system/xasync/functions/xasyncrun.md) não podem ser
cancelados. O suporte a cancelamento pode ser adicionado manualmente quando você usa um
provedor personalizado. Depois que o suporte é adicionado, [XAsyncCancel](https://docs.xbox.com/pt-BR/reference/system/xasync/functions/xasynccancel.md)
dispara o caso `Cancel`.

```c++ theme={null}
// 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.
    }
}
```

Nesses casos de provedor, o suporte a cancelamento é adicionado usando um
evento do Windows. Ele é sinalizado se o caso `Cancel` for chamado, e o
caso `DoWork` termina com uma chamada a [XAsyncComplete](https://docs.xbox.com/pt-BR/reference/system/xasyncprovider/functions/xasynccomplete.md) com
o status `E_ABORT`. Qualquer método pode ser usado para sinalizar o cancelamento. No entanto,
um evento é uma forma simples de sinalizar o cancelamento que é compatível com qualquer plataforma do Microsoft Game Development Kit (GDK) que possa ser direcionada.

Para disparar o caso `Cancel`, chame `XAsyncCancel`
com o bloco assíncrono da tarefa, conforme mostrado a seguir.

```c++ theme={null}
XAsyncCancel(async);
```

## Documentação de referência da API

* [XAsyncProvider (conteúdo da API)](https://docs.xbox.com/pt-BR/reference/system/xasyncprovider/xasyncprovider_members.md)
  * Funções
    * [XAsyncComplete](https://docs.xbox.com/pt-BR/reference/system/xasyncprovider/functions/xasynccomplete.md)
* [xasync (conteúdo da API)](https://docs.xbox.com/pt-BR/reference/system/xasync/xasync_members.md)
  * Funções
    * [XAsyncRun](https://docs.xbox.com/pt-BR/reference/system/xasync/functions/xasyncrun.md)
    * [XAsyncCancel](https://docs.xbox.com/pt-BR/reference/system/xasync/functions/xasynccancel.md)

## Consulte também

[Visão geral da biblioteca XAsyncProvider](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-libraries/async-library-xasyncprovider.md)

[Configurar provedor personalizado (exemplo)](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-custom-provider.md)

[Configurar métodos de invocação (exemplo)](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-invocation-methods.md)

[Configurar dados de retorno (exemplo)](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-return-data.md)

[XAsyncProvider](https://docs.xbox.com/pt-BR/reference/system/xasyncprovider/xasyncprovider_members.md)


## Related topics

- [Bibliotecas XAsync para programação de tarefas assíncronas](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-libraries/index.md)
- [Exemplo de configuração de provedor personalizado](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-custom-provider.md)
- [Exemplo de configuração de métodos de invocação](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-invocation-methods.md)
- [Exemplo de configuração de dados de retorno](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-return-data.md)
- [Exemplo de configuração de tarefa assíncrona](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-libraries/async-library-xasync-example-setup-async-task.md)
