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

# 通用非同步工作包裝函式

> 通用非同步工作包裝函式

本主題提供通用非同步工作包裝函式的範例。您可以建立 `RunTask` 包裝函式來簡化此
程序，而不必為每個工作手動設定非同步區塊並呼叫 [XAsyncRun](/zh-TW/reference/system/xasync/functions/xasyncrun)。
使用此包裝函式，您可以指定工作佇列、工作以及選用的完成回呼。

```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](/zh-TW/reference/system/xasync/functions/xasyncrun)。`RunTask` 會封裝重複使用的樣板
程式碼，建立簡單的獨立工作函式。透過使用 `std::function`，簡單的資料擷取會傳遞給回呼，而不需要內容參數。

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

## 參考 API 文件

* [Xasync (API 內容)](/zh-TW/reference/system/xasync/xasync_members)
  * 函式
    * [XAsyncRun](/zh-TW/reference/system/xasync/functions/xasyncrun)
* [Xtaskqueue (API 內容)](/zh-TW/reference/system/xtaskqueue/xtaskqueue_members)

## 另請參閱

[非同步程式設計概觀](/zh-TW/build/core-features/common/async/async-toc)
[XAsync](/zh-TW/reference/system/xasync/xasync_members)
[XTaskQueue](/zh-TW/reference/system/xtaskqueue/xtaskqueue_members)


## Related topics

- [Unity 總覽](/zh-TW/paths/unity/overview.md)
- [PFLeaderboardsGetLeaderboardAsync](/zh-TW/services/playfab/api-references/c/pfleaderboards/functions/pfleaderboardsgetleaderboardasync.md)
- [PFLocalizationGetLanguageListAsync](/zh-TW/services/playfab/api-references/c/pflocalization/functions/pflocalizationgetlanguagelistasync.md)
- [PFStatisticsIncrementStatisticVersionAsync](/zh-TW/services/playfab/api-references/c/pfstatistics/functions/pfstatisticsincrementstatisticversionasync.md)
- [PFLeaderboardsGetLeaderboardForEntitiesAsync](/zh-TW/services/playfab/api-references/c/pfleaderboards/functions/pfleaderboardsgetleaderboardforentitiesasync.md)
