次の方法で共有


汎用非同期タスク ラッパー

このトピックでは、汎用非同期タスク ラッパーの例を示します。 手動で非同期ブロックをセットアップして、各タスクの XAsyncRun を呼び出す代わりに、RunTask ラッパーを作成してこのプロセスを簡略化することができます。 このラッパーを使用すると、タスク キュー、処理、およびオプションの完了コールバックを指定することができます。

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

前のサンプルでは、1 つの非同期ブロックと 2 つのコールバック (処理が 1 つと完了が 1 つ) を受け取る関数が実装されています。 完了コールバックはオプションなので、処理コールバックだけを受け取るバージョンを記述することもできます。

このサンプルでは、標準パターンを使用して、非同期ブロックとコンテキスト データをセットアップし、XAsyncRun を呼び出します。 RunTask によって定型コードをカプセル化して、簡単なスタンドアロンのタスク関数を作成します。 簡単なデータ キャプチャでは、std::function を使用して、コンテキスト パラメーターなしでコールバックに移動します。

RunTask(taskQueue,
    []()
    {
        // Work Callback
    },
    []()
    {
        // Completion Callback
    });

関連項目

非同期プログラミングの概要
XAsync
XTaskQueue