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

# 非同步工作佇列設計

> 非同步工作佇列設計

本主題說明搭配 Microsoft Game Development Kit (GDK) 非同步設計模式使用的
Microsoft Game Development Kit (GDK) 工作佇列。*工作佇列*
是用於將工作和完成工作回呼排入佇列的 API。工作佇列可以設定為數種不同分派模式之一，包括手動分派機制，您可以使用該機制
仔細管理遊戲工作負載。

## 工作佇列 API 概觀

工作佇列是由兩個佇列連接埠組合而成：工作連接埠和
完成連接埠。這些連接埠會綁定在同一個物件中，因為您
通常兩者都需要：工作連接埠用於執行非同步工作，而
完成連接埠用於將其告知使用者。

工作佇列的說明如下。

* 包含兩個工作佇列連接埠。

* 每個工作佇列連接埠都可以有自己的分派模式，此模式決定
  佇列中的項目如何分派。

* 分派模式的範圍從透過
  系統執行緒集區完全自動分派，到必須
  明確移除工作的完全手動分派。

* 回呼可以提交至佇列的任一連接埠。

* 佇列以控制代碼表示。控制代碼可以複製，這基本上
  會增加佇列的參考計數。

您可以指定分派模式，以個別設定每個工作佇列連接埠。*分派模式*會決定如何處理
排入連接埠佇列的回呼。分派模式有數種。

* **執行緒集區：** 排入執行緒集區佇列的回呼會在
  系統執行緒集區上執行。執行緒集區會平行叫用
  呼叫，每當有執行緒集區執行緒可用時，就依序從佇列取出
  要執行的呼叫。

* **序列化執行緒集區：** 回呼會排入佇列並在
  執行緒集區上執行，但會逐一執行，而不是在所有執行緒集區執行緒上
  平行執行。

* **手動：** 排入手動佇列的回呼不會自動
  分派。您可以自行決定在任何想要的執行緒上
  分派它們。如果您使用手動工作佇列，必須確保您
  也會提取 Windows 訊息佇列。

* **立即：** 立即分派模式完全不會排入佇列。它會
  立即在提交回呼的執行緒上執行
  該呼叫。

工作佇列控制代碼是可共用的資源。關閉控制代碼會釋放
佇列上的一個參考。在所有參考都釋放之前，佇列實際上
不會終結。`XTaskQueueDuplicateHandle`、
`XTaskQueueSubmitCallback`、`XTaskQueueSubmitDelayedCallback` 和
`XTaskQueueCreateComposite` 都會為佇列控制代碼新增參考。這
表示在所有回呼完成之前，佇列實際上
不會終結。

工作佇列控制代碼是每個處理序專屬的資源，無法封送處理或
在處理序之外使用。

### 使用模式

工作佇列的典型使用模式如下。

1. 建立工作佇列控制代碼，然後為每個連接埠指定分派模式。

2. 如果您使用手動分派，請建立應用程式專屬的執行緒，以
   呼叫佇列的分派函式。

3. 將佇列當作 Microsoft Game Development Kit (GDK) 呼叫的參數使用，或直接
   使用 `XTaskQueueCallback` 提交。

4. (選擇性) 在應用程式關閉時終止工作佇列。

### 非同步工作佇列操作說明主題

本節提供常見非同步工作佇列案例的操作說明範例。

## 本節內容

[建立執行緒集區工作佇列](/zh-TW/build/core-features/common/async/async-task-queue-design-howto/creating-thread-pool-task-queue)
提供範例，示範如何建立工作佇列，以在系統執行緒集區上分派工作回呼和完成回呼。

[提交回呼](/zh-TW/build/core-features/common/async/async-task-queue-design-howto/submitting-callbacks)
提供範例，示範如何將回呼提交至工作佇列的工作連接埠或完成連接埠。

[複製工作佇列控制代碼](/zh-TW/build/core-features/common/async/async-task-queue-design-howto/duplicating-task-queue-handle)
提供範例，示範如何複製工作佇列控制代碼。如果您有長時間執行的工作，可能會想要在工作期間複製工作佇列控制代碼。如此一來，在您仍需要佇列時，任何呼叫 `XTaskQueueCloseHandle` 的人都不會關閉該佇列。

[建立手動工作佇列](/zh-TW/build/core-features/common/async/async-task-queue-design-howto/creating-manual-task-queue)
提供範例，示範如何建立以手動方式提取的工作佇列。它會建立兩個 STL 執行緒，分別為工作連接埠和完成連接埠分派呼叫。

[使用事件控制手動佇列分派](/zh-TW/build/core-features/common/async/async-task-queue-design-howto/control-manual-queue-dispatching)
提供範例，示範如何在工作佇列有項目要分派時，使用工作佇列對條件變數發出訊號。

[搭配 Windows 訊息迴圈使用工作佇列](/zh-TW/build/core-features/common/async/async-task-queue-design-howto/task-queue-windows-msg-loop)
提供範例，使用執行緒集區處理工作，但將完成連接埠回呼整合至 Win32 視窗程序。此範例也示範了在將工作佇列與其他執行緒模型整合時，如何正確終止工作佇列。

[使用處理序工作佇列](/zh-TW/build/core-features/common/async/async-task-queue-design-howto/using-process-task-queue)
提供範例，示範如何使用處理序工作佇列。預設的處理序工作佇列會使用執行緒集區進行工作分派和完成分派。

[建立複合工作佇列](/zh-TW/build/core-features/common/async/async-task-queue-design-howto/creating-composite-task-queue)
提供範例，使用執行緒集區處理工作，但將完成連接埠回呼整合至 Win32 WindowProc 回呼函式。此範例也示範了在將工作佇列與其他執行緒模型整合時，如何正確終止工作佇列。

[使用延遲回呼](/zh-TW/build/core-features/common/async/async-task-queue-design-howto/using-delayed-callbacks)
提供範例，示範如何使用延遲回呼，每 500 毫秒叫用一次回呼，共叫用 10 次。使用工作佇列並透過 `XTaskQueueSubmitDelayedCallback` API，在未來的時間點提交回呼。如此一來，您可以在短暫延遲後重試失敗的呼叫，或將其當作定期事件的低成本計時器使用。

[使用工作佇列等候程式](/zh-TW/build/core-features/common/async/async-task-queue-design-howto/using-task-queue-waiter)
提供範例，示範如何使用工作佇列等候程式。您可以向工作佇列註冊 Win32 核心控制代碼。當控制代碼變成已發出訊號狀態時，您的回呼就會提交至佇列。

## 參考 API 文件

* [XTaskQueue (API 內容)](/zh-TW/reference/system/xtaskqueue/xtaskqueue_members)


## Related topics

- [GDK 範例](/zh-TW/home/setup-install/samples.md)
- [PlayFab Party 版本資訊](/zh-TW/services/playfab/multiplayer/networking/release-notes.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)
- [PFLeaderboardsIncrementLeaderboardVersionAsync](/zh-TW/services/playfab/api-references/c/pfleaderboards/functions/pfleaderboardsincrementleaderboardversionasync.md)
