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

# Exemple de configuration d'un fournisseur personnalisé

> Exemple de configuration d'un fournisseur personnalisé

Cette rubrique fournit un exemple de configuration d'un fournisseur asynchrone personnalisé. Lors de l'écriture d'un fournisseur asynchrone personnalisé, les méthodes asynchrones sont démarrées par un
appel à [XAsyncBegin](/fr-CA/reference/system/xasyncprovider/functions/xasyncbegin). Cette fonction possède un paramètre de rappel
qui implémente, par exemple, la gestion des changements d'état, la mise en file d'attente
des rappels et le déclenchement de l'achèvement.

```c++ theme={null}
struct Context
{
    uint64_t result;
};

Context* context = new Context{ 0 };
// Assume that the async block is already filled out with the completion callback and task queue.
HRESULT hr = XAsyncBegin(async, context, ProviderFuncIdentity, __FUNCTION__,
    [](XAsyncOp op, const XAsyncProviderData* providerData)
    {
        Context* context =
        reinterpret_cast<Context*>(providerData->context);
        switch (op)
        {
            case XAsyncOp::Begin:
                return XAsyncSchedule(providerData->async, 0);

            case XAsyncOp::Cleanup:
                delete context;
                break;

            case XAsyncOp::GetResult:
                memcpy(providerData->buffer, &context->result, sizeof(uint64_t));
                break;

            case XAsyncOp::DoWork:
                context->result = 12345678;
                XAsyncComplete(providerData->async, S_OK, sizeof(uint64_t));
                break;

            case XAsyncOp::Cancel:
                // This call can't be canceled.
                break;
        }

    return S_OK;
});
```

Il y a beaucoup d'éléments à analyser ici, mais l'idée de base est simple :
appelez `XAsyncBegin` et fournissez-lui un [rappel de fournisseur](/fr-CA/reference/system/xasyncprovider/functions/xasyncprovider)
pour gérer les différents changements d'état. Rappelez-vous que le bloc
asynchrone contient la file d'attente de tâches à utiliser et une implémentation facultative d'un
rappel d'achèvement. Le rappel doit ensuite gérer les [cinq
cas différents](/fr-CA/reference/system/xasyncprovider/enums/xasyncop) de l'exécution de la tâche asynchrone, comme le montre le tableau suivant.

| Cas du fournisseur | Responsabilité |
| - | - |
| `Begin` | Appelé immédiatement par l'appel à `XAsyncBegin`. Ce cas est chargé de planifier le rappel de travail asynchrone dans la file d'attente de tâches. Cela est géré par un appel à [XAsyncSchedule](/fr-CA/reference/system/xasyncprovider/functions/xasyncschedule). Celui-ci met ce rappel en file d'attente afin qu'il s'exécute de nouveau avec le cas `DoWork` par l'intermédiaire du port de travail de la file d'attente de tâches. |
| `Cleanup` | Appelé lorsque la tâche asynchrone se termine et que toutes les données internes créées pour le suivi peuvent être supprimées. Dans l'exemple de code précédent, ce cas nettoie la structure `Context`, qui avait été allouée pour assurer le suivi des données de résultat. |
| `GetResult` | Appelé lorsque l'utilisateur appelle [XAsyncGetResult](/fr-CA/reference/system/xasyncprovider/functions/xasyncgetresult). Le cas doit alors écrire dans la mémoire tampon de sortie qui lui est passée. Le résultat asynchrone d'origine doit donc avoir été enregistré quelque part. L'exemple de code précédent l'enregistre dans la structure `Context`.<br /><br />Les fonctions d'API asynchrones du Microsoft Game Development Kit (GDK) qui retournent des données à partir d'une tâche asynchrone appellent `XAsyncGetResult` en interne et convertissent ces données sous une forme adaptée à l'appelant. Nous recommandons cette approche pour travailler avec les résultats. |
| `DoWork` | Appelé par l'intermédiaire de la file d'attente de tâches dont le port de travail est distribué. Cela signifie que le cadre de pile de ce rappel s'exécute sur le thread prévu, selon la façon dont la file d'attente de tâches a été configurée. Tout travail doit être effectué ici.<br /><br />Dans l'implémentation interne du fournisseur asynchrone de [XAsyncRun](/fr-CA/reference/system/xasync/functions/xasyncrun), c'est ici que le rappel de travail passé est exécuté. Pour les fournisseurs personnalisés, le travail peut être effectué directement dans le rappel ou au moyen d'une méthode personnalisée qui encapsule la fonctionnalité.<br /><br />Lorsque le travail est terminé, [XAsyncComplete](/fr-CA/reference/system/xasyncprovider/functions/xasynccomplete) doit être appelée. Cette fonction effectue deux tâches. D'abord, elle indique si des données de sortie sont nécessaires en fournissant une taille de données. Si une valeur supérieure à zéro est fournie, une mémoire tampon interne est allouée afin que le cas `GetResult` puisse y écrire. Ensuite, elle met en file d'attente un appel au rappel d'achèvement, qui sera exécuté sur le port d'achèvement de la file d'attente de tâches. Le code d'état d'achèvement passé à `XAsyncComplete` devient le code retourné par un appel à [XAsyncGetStatus](/fr-CA/reference/system/xasync/functions/xasyncgetstatus). |
| `Cancel` | Déclenché par un appel externe à [XAsyncCancel](/fr-CA/reference/system/xasync/functions/xasynccancel). Si ce cas n'est pas implémenté, rien ne se produit. Pour permettre l'annulation, le fournisseur doit être en mesure de signaler à tout travail en cours d'exécution de s'arrêter. Le cas `DoWork` doit alors appeler `XAsyncComplete` avec l'état `E_ABORT`. |

## Documentation de référence de l'API

* [XAsyncProvider (contenu de l'API)](/fr-CA/reference/system/xasyncprovider/xasyncprovider_members)
  * Fonctions
    * [XAsyncBegin](/fr-CA/reference/system/xasyncprovider/functions/xasyncbegin)
    * [xasyncprovider](/fr-CA/reference/system/xasyncprovider/functions/xasyncprovider)
    * [XAsyncSchedule](/fr-CA/reference/system/xasyncprovider/functions/xasyncschedule)
    * [XAsyncGetResult](/fr-CA/reference/system/xasyncprovider/functions/xasyncgetresult)
    * [XAsyncComplete](/fr-CA/reference/system/xasyncprovider/functions/xasynccomplete)
* [xasync (contenu de l'API)](/fr-CA/reference/system/xasync/xasync_members)
  * Fonctions
    * [XAsyncRun](/fr-CA/reference/system/xasync/functions/xasyncrun)
    * [XAsyncGetStatus](/fr-CA/reference/system/xasync/functions/xasyncgetstatus)
    * [XAsyncCancel](/fr-CA/reference/system/xasync/functions/xasynccancel)

## Voir aussi

[Vue d'ensemble de la bibliothèque XAsyncProvider](/fr-CA/build/core-features/common/async/async-libraries/async-library-xasyncprovider)

[Configurer des méthodes d'appel (exemple)](/fr-CA/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-invocation-methods)

[Configurer des données de retour (exemple)](/fr-CA/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-return-data)

[Configurer la possibilité d'annulation (exemple)](/fr-CA/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-cancelability)

[XAsyncProvider](/fr-CA/reference/system/xasyncprovider/xasyncprovider_members)


## Related topics

- [Aperçu de Godot et des moteurs communautaires](/fr-CA/paths/community-engines/overview.md)
- [Intégration des partenaires XBOX pour l'accès au GDK](/fr-CA/home/onboarding.md)
- [Intégration des partenaires XBOX : accès et publication](/fr/home/onboarding.md)
- [Vue d'ensemble de Godot et des moteurs communautaires](/fr/paths/community-engines/overview.md)
- [XR-018 : Contenu généré par l'utilisateur](/fr/publishing/certification/xr/xr-018.md)
