> ## 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.

# Wrapper genérico de tarefa assíncrona

> Wrapper genérico de tarefa assíncrona

Este tópico fornece um exemplo de um wrapper genérico de tarefa assíncrona. Em vez de configurar manualmente blocos assíncronos e chamar [XAsyncRun](https://docs.xbox.com/pt-BR/reference/system/xasync/functions/xasyncrun.md)
para cada tarefa, crie um wrapper `RunTask` para simplificar esse
processo. Usando esse wrapper, você pode especificar uma fila de tarefas, um trabalho e um retorno de chamada de conclusão opcional.

```c++ theme={null}
void RunTask(XTaskQueueHandle taskQueue,
    std::function<void()> workCallback,
    std::function<void()> completionCallback)
{
    struct RunTaskContext
    {
        std::function<void()> workCallback;
        std::function<void()> completionCallback;
    };

    RunTaskContext* context = new RunTaskContext();
    context->workCallback = workCallback;
    context->completionCallback = completionCallback;
    XAsyncBlock* async = new XAsyncBlock{};
    async->queue = taskQueue;
    async->context = context;
    async->callback = [](XAsyncBlock* async)
    {
        RunTaskContext* context = static_cast<RunTaskContext*>(async->context);
        context->completionCallback();
        delete context;
        delete async;
    };

    // Callback passed to XAsyncRun is the work callback
    XAsyncRun(async,
        [](XAsyncBlock* async)->HRESULT
        {
            RunTaskContext* context = static_cast<RunTaskContext*>(async->context);
            context->workCallback();
            return S_OK;
        });
}
```

O exemplo anterior implementa uma função que recebe um bloco assíncrono e dois
retornos de chamada: um de trabalho e um de conclusão. Você pode escrever uma versão que
receba apenas um retorno de chamada de trabalho, pois o retorno de chamada de conclusão é opcional.

Ele usa o padrão comum para configurar um bloco assíncrono, configurar os dados de
contexto e chamar [XAsyncRun](https://docs.xbox.com/pt-BR/reference/system/xasync/functions/xasyncrun.md). `RunTask` encapsula o código
clichê, criando uma função de tarefa independente simples. A captura simples de dados é passada para os retornos de chamada sem parâmetros de contexto usando `std::function`.

```c++ theme={null}
RunTask(taskQueue,
    []()
    {
        // Work Callback
    },
    []()
    {
        // Completion Callback
    });
```

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

* [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)
* [Xtaskqueue (conteúdo da API)](https://docs.xbox.com/pt-BR/reference/system/xtaskqueue/xtaskqueue_members.md)

## Consulte também

[Visão geral da programação assíncrona](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-toc.md)
[XAsync](https://docs.xbox.com/pt-BR/reference/system/xasync/xasync_members.md)
[XTaskQueue](https://docs.xbox.com/pt-BR/reference/system/xtaskqueue/xtaskqueue_members.md)


## Related topics

- [XAsyncRun](https://docs.xbox.com/pt-BR/reference/system/xasync/functions/xasyncrun.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)
- [Design da fila de tarefas assíncronas](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-task-queue-design.md)
- [Bibliotecas XAsync para programação de tarefas assíncronas](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-libraries/index.md)
- [Modelo de programação assíncrona no XBOX GDK](https://docs.xbox.com/pt-BR/build/core-features/common/async/index.md)
