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

# 通用异步任务包装器

> 通用异步任务包装器

本主题提供了一个通用异步任务包装器的示例。与其为每个任务手动设置异步块并调用 [XAsyncRun](/reference/system/xasync/functions/xasyncrun)，不如创建一个 `RunTask` 包装器来简化此过程。通过使用此包装器，你可以指定一个任务队列、一个工作回调以及一个可选的完成回调。

```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;
        });
}
```

前面的示例实现了一个函数，它接受一个异步块和两个回调：一个工作回调和一个完成回调。你也可以编写一个只接受工作回调的版本，因为完成回调是可选的。

它使用标准模式设置异步块、设置上下文数据并调用 [XAsyncRun](/reference/system/xasync/functions/xasyncrun)。`RunTask` 封装了样板代码，创建了一个简单的独立任务函数。通过使用 `std::function` 进行简单的数据捕获，无需上下文参数就能传递给回调。

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

## 参考 API 文档

* [Xasync (API 内容)](/reference/system/xasync/xasync_members)
  * 函数
    * [XAsyncRun](/reference/system/xasync/functions/xasyncrun)
* [Xtaskqueue (API 内容)](/reference/system/xtaskqueue/xtaskqueue_members)

## 另请参阅

[异步编程概述](/build/core-features/common/async/async-toc)
[XAsync](/reference/system/xasync/xasync_members)
[XTaskQueue](/reference/system/xtaskqueue/xtaskqueue_members)


## Related topics

- [XBOX GDK 中的异步编程模型](/zh-CN/build/core-features/common/async/index.md)
- [XAsyncRun](/zh-CN/reference/system/xasync/functions/xasyncrun.md)
- [异步编程概述](/zh-CN/build/core-features/common/async/async-toc.md)
- [面向 GDK 的 Unity C# API 包装器](/zh-CN/build/gdk-and-engines/unity/unity-api-wrappers.md)
- [进行异步调用](/zh-CN/services/playfab/sdks/c/async.md)
