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

前述のサンプルは、非同期ブロックと 2 つのコールバック (ワークと完了) を受け取る関数を実装しています。完了コールバックはオプションであるため、ワーク コールバックだけを受け取るバージョンを作成することもできます。

これは、非同期ブロックのセットアップ、コンテキスト データのセットアップ、および [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 の非同期プログラミング モデル](/ja-jp/build/core-features/common/async/index.md)
- [非同期プログラミングの概要](/ja-jp/build/core-features/common/async/async-toc.md)
- [非同期タスク キューの設計](/ja-jp/build/core-features/common/async/async-task-queue-design.md)
- [非同期タスクのセットアップ例](/ja-jp/build/core-features/common/async/async-libraries/async-library-xasync-example-setup-async-task.md)
- [非同期タスク プログラミング向け XAsync ライブラリ](/ja-jp/build/core-features/common/async/async-libraries/index.md)
