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

# Design da fila de tarefas assíncronas

> Design da fila de tarefas assíncronas

Este tópico descreve a fila de tarefas do Microsoft Game Development Kit (GDK) usada em
conjunto com o padrão de design assíncrono do Microsoft Game Development Kit (GDK). Uma *fila de tarefas*
é uma API para enfileirar trabalho e retornos de chamada de tarefas de conclusão. Uma fila de tarefas pode ser configurada em um de vários modos de despacho diferentes, incluindo um mecanismo de despacho manual que você pode usar
para gerenciar cuidadosamente as cargas de trabalho de jogos.

## Visão geral da API da fila de tarefas

Uma fila de tarefas é composta por duas portas de fila: uma porta de trabalho e uma
porta de conclusão. Essas portas são agrupadas no mesmo objeto porque você
geralmente precisa de ambas: a porta de trabalho para realizar trabalho assíncrono e a
porta de conclusão para informar o usuário sobre ele.

Uma fila de tarefas é descrita da seguinte forma.

* Contém duas portas de fila de tarefas.

* Cada porta de fila de tarefas pode ter seu próprio modo de despacho, que determina
  como os itens na fila são despachados.

* Os modos de despacho variam desde o despacho totalmente automático por meio do
  pool de threads do sistema até o despacho totalmente manual, no qual as tarefas precisam ser
  removidas explicitamente.

* Os retornos de chamada podem ser enviados para qualquer uma das portas da fila.

* As filas são representadas como identificadores. Os identificadores podem ser duplicados, o que
  essencialmente aumenta uma contagem de referências na fila.

Você pode configurar cada porta da fila de tarefas de forma independente especificando um modo de despacho. Um *modo de despacho* determina como os retornos de chamada
enfileirados em uma porta são processados. Há vários modos de despacho.

* **Pool de threads:** os retornos de chamada enfileirados em uma fila de pool de threads são
  executados no pool de threads do sistema. O pool de threads invoca as
  chamadas em paralelo, retirando por sua vez uma chamada da fila para executar
  à medida que os threads do pool ficam disponíveis.

* **Pool de threads serializado:** os retornos de chamada são enfileirados e executados no
  pool de threads, mas são executados um após o outro, em vez de em paralelo
  em todos os threads do pool.

* **Manual:** os retornos de chamada enfileirados em uma fila manual não são despachados
  automaticamente. Cabe a você despachá-los em qualquer thread
  que desejar. Se você usar filas de tarefas manuais, deverá garantir que
  também bombeie a fila de mensagens do Windows.

* **Imediato:** o modo de despacho imediato não enfileira nada. Ele
  executa imediatamente a chamada no thread que enviou o
  retorno de chamada.

Um identificador de fila de tarefas é um recurso compartilhável. Fechar o identificador libera
uma referência na fila. A fila não é de fato destruída até que todas as
referências sejam liberadas. `XTaskQueueDuplicateHandle`,
`XTaskQueueSubmitCallback`, `XTaskQueueSubmitDelayedCallback` e
`XTaskQueueCreateComposite` adicionam uma referência ao identificador da fila. Isso
significa que a fila não é de fato destruída até que todos os retornos de chamada
tenham sido concluídos.

Um identificador de fila de tarefas é um recurso por processo e não pode ser empacotado (marshaled) nem
usado fora do processo.

### Padrão de uso

O padrão de uso típico de uma fila de tarefas é o seguinte.

1. Crie um identificador de fila de tarefas e especifique os modos de despacho de cada porta.

2. Se você estiver usando despacho manual, estabeleça threads específicos do aplicativo para
   chamar a função de despacho da fila.

3. Use a fila como parâmetro para chamadas do Microsoft Game Development Kit (GDK) ou envie
   diretamente usando `XTaskQueueCallback`.

4. Opcionalmente, encerre a fila de tarefas quando o aplicativo for desligado.

### Tópicos de instruções da fila de tarefas assíncronas

Esta seção fornece exemplos de instruções para cenários comuns da fila de tarefas assíncronas.

## Nesta seção

[Criar uma fila de tarefas de pool de threads](/pt-BR/build/core-features/common/async/async-task-queue-design-howto/creating-thread-pool-task-queue)
Fornece um exemplo que mostra como criar uma fila de tarefas que despacha os retornos de chamada de trabalho e de conclusão no pool de threads do sistema.

[Enviar retornos de chamada](/pt-BR/build/core-features/common/async/async-task-queue-design-howto/submitting-callbacks)
Fornece um exemplo que mostra como um retorno de chamada é enviado para a porta de trabalho ou para a porta de conclusão de uma fila de tarefas.

[Duplicar um identificador de fila de tarefas](/pt-BR/build/core-features/common/async/async-task-queue-design-howto/duplicating-task-queue-handle)
Fornece um exemplo que mostra como duplicar um identificador de fila de tarefas. Se você tiver um trabalho de longa duração, talvez queira duplicar o identificador da fila de tarefas durante o trabalho. Dessa forma, quem chamar `XTaskQueueCloseHandle` não fechará a fila enquanto você ainda precisar dela.

[Criar uma fila de tarefas manual](/pt-BR/build/core-features/common/async/async-task-queue-design-howto/creating-manual-task-queue)
Fornece um exemplo que mostra como criar uma fila de tarefas bombeada manualmente. Ele cria dois threads STL que despacham chamadas tanto para a porta de trabalho quanto para a porta de conclusão.

[Usar eventos para controlar o despacho de filas manuais](/pt-BR/build/core-features/common/async/async-task-queue-design-howto/control-manual-queue-dispatching)
Fornece um exemplo que mostra como usar uma fila de tarefas para sinalizar uma variável de condição quando ela tiver itens a despachar.

[Usar uma fila de tarefas com um loop de mensagens do Windows](/pt-BR/build/core-features/common/async/async-task-queue-design-howto/task-queue-windows-msg-loop)
Fornece um exemplo que usa o pool de threads para o trabalho, mas integra os retornos de chamada da porta de conclusão em um procedimento de janela (Window proc) do Win32. Este exemplo também demonstra o encerramento correto de uma fila de tarefas quando você a integra a outro modelo de threading.

[Usar a fila de tarefas do processo](/pt-BR/build/core-features/common/async/async-task-queue-design-howto/using-process-task-queue)
Fornece um exemplo que mostra como usar a fila de tarefas do processo. A fila de tarefas do processo padrão usa o pool de threads para o despacho de trabalho e de conclusão.

[Criar uma fila de tarefas composta](/pt-BR/build/core-features/common/async/async-task-queue-design-howto/creating-composite-task-queue)
Fornece um exemplo que usa o pool de threads para o trabalho, mas integra os retornos de chamada da porta de conclusão em uma função de retorno de chamada WindowProc do Win32. Este exemplo também demonstra o encerramento correto de uma fila de tarefas quando você a está integrando a outro modelo de threading.

[Usar retornos de chamada atrasados](/pt-BR/build/core-features/common/async/async-task-queue-design-howto/using-delayed-callbacks)
Fornece um exemplo que mostra como usar retornos de chamada atrasados, invocando 10 retornos de chamada, um a cada 500 ms. Use uma fila de tarefas para enviar retornos de chamada no futuro usando a API `XTaskQueueSubmitDelayedCallback`. Dessa forma, você pode repetir uma chamada com falha após um pequeno atraso ou usá-la como um temporizador barato para eventos periódicos.

[Usar um waiter de fila de tarefas](/pt-BR/build/core-features/common/async/async-task-queue-design-howto/using-task-queue-waiter)
Fornece um exemplo que mostra como usar um waiter de fila de tarefas. Você pode registrar um identificador de kernel do Win32 em uma fila de tarefas. Seu retorno de chamada será enviado para a fila quando o identificador for sinalizado.

## Documentação de referência da API

* [XTaskQueue (conteúdo da API)](/pt-BR/reference/system/xtaskqueue/xtaskqueue_members)


## Related topics

- [Notas de versão do PlayFab Party](/pt-BR/services/playfab/multiplayer/networking/release-notes.md)
- [Exemplos do GDK](/pt-BR/home/setup-install/samples.md)
- [XBOX Accessibility Guidelines (XAG)](/pt-BR/build/game-principles/accessibility/xbox-accessibility-guidelines.md)
- [Notas de versão do SDK C++ do PlayFab Multiplayer](/pt-BR/services/playfab/multiplayer/lobby/lobby-matchmaking-sdks/lobby-and-matchmaking-release-notes.md)
- [PFLeaderboardsGetLeaderboardAsync](/pt-BR/services/playfab/api-references/c/pfleaderboards/functions/pfleaderboardsgetleaderboardasync.md)
