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

# Contenedor genérico de tareas asincrónicas

> Contenedor genérico de tareas asincrónicas

En este tema se proporciona un ejemplo de un contenedor genérico de tareas asincrónicas. En lugar de configurar manualmente bloques asincrónicos y llamar a [XAsyncRun](/reference/system/xasync/functions/xasyncrun)
para cada tarea, cree un contenedor `RunTask` para simplificar este
proceso. Con este contenedor, puede especificar una cola de tareas, una devolución de llamada de trabajo y una devolución de llamada de finalización 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;
        });
}
```

El ejemplo anterior implementa una función que toma un bloque asincrónico y dos
devoluciones de llamada: una de trabajo y una de finalización. Puede escribir una versión que
solo tome una devolución de llamada de trabajo, porque la devolución de llamada de finalización es opcional.

Usa el patrón estándar para configurar un bloque asincrónico, configurar los datos de
contexto y llamar a [XAsyncRun](/reference/system/xasync/functions/xasyncrun). `RunTask` encapsula el código
reutilizable, creando una función de tarea independiente sencilla. La captura simple de datos se pasa a las devoluciones de llamada sin parámetros de contexto mediante `std::function`.

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

## Documentación de referencia de la API

* [Xasync (contenido de la API)](/reference/system/xasync/xasync_members)
  * Funciones
    * [XAsyncRun](/reference/system/xasync/functions/xasyncrun)
* [Xtaskqueue (contenido de la API)](/reference/system/xtaskqueue/xtaskqueue_members)

## Consulte también

[Información general sobre programación asincrónica](/build/core-features/common/async/async-toc)
[XAsync](/reference/system/xasync/xasync_members)
[XTaskQueue](/reference/system/xtaskqueue/xtaskqueue_members)
