> ## 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/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 transmettez-lui un [rappel de fournisseur](/fr/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/reference/system/xasyncprovider/enums/xasyncop) de l'exécution de la tâche asynchrone, comme indiqué dans 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. Cette opération est gérée par un appel à [XAsyncSchedule](/fr/reference/system/xasyncprovider/functions/xasyncschedule). Celui-ci met ce rappel en file d'attente pour qu'il s'exécute à nouveau avec le cas `DoWork` via le 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 suivre les données de résultat. |
| `GetResult` | Appelé lorsque l'utilisateur appelle [XAsyncGetResult](/fr/reference/system/xasyncprovider/functions/xasyncgetresult). Le cas doit alors écrire dans la mémoire tampon de sortie qui lui est transmise. 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 renvoient des données d'une tâche asynchrone appellent `XAsyncGetResult` en interne et convertissent ces données sous la forme adaptée à l'appelant. Nous recommandons cette approche pour travailler avec les résultats. |
| `DoWork` | Appelé via la file d'attente de tâches dont le port de travail est distribué. Cela signifie que le frame de pile de ce rappel s'exécute sur le thread prévu, en fonction de la configuration de la file d'attente de tâches. Tout le travail doit être effectué ici.<br /><br />Dans l'implémentation du fournisseur asynchrone interne de [XAsyncRun](/fr/reference/system/xasync/functions/xasyncrun), c'est ici que le rappel de travail transmis est exécuté. Pour les fournisseurs personnalisés, le travail peut être effectué directement dans le rappel ou à l'aide d'une méthode personnalisée qui encapsule la fonctionnalité.<br /><br />Une fois le travail terminé, [XAsyncComplete](/fr/reference/system/xasyncprovider/functions/xasynccomplete) doit être appelé. Cette fonction effectue deux tâches. Premièrement, 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 pour que le cas `GetResult` puisse y écrire. Deuxièmement, elle met en file d'attente un appel au rappel d'achèvement pour qu'il s'exécute sur le port d'achèvement de la file d'attente de tâches. Le code d'état d'achèvement transmis à `XAsyncComplete` devient le code renvoyé par un appel à [XAsyncGetStatus](/fr/reference/system/xasync/functions/xasyncgetstatus). |
| `Cancel` | Déclenché par un appel externe à [XAsyncCancel](/fr/reference/system/xasync/functions/xasynccancel). Si ce cas n'est pas implémenté, rien ne se passe. Pour permettre l'annulation, le fournisseur doit pouvoir 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/reference/system/xasyncprovider/xasyncprovider_members)
  * Fonctions
    * [XAsyncBegin](/fr/reference/system/xasyncprovider/functions/xasyncbegin)
    * [xasyncprovider](/fr/reference/system/xasyncprovider/functions/xasyncprovider)
    * [XAsyncSchedule](/fr/reference/system/xasyncprovider/functions/xasyncschedule)
    * [XAsyncGetResult](/fr/reference/system/xasyncprovider/functions/xasyncgetresult)
    * [XAsyncComplete](/fr/reference/system/xasyncprovider/functions/xasynccomplete)
* [xasync (contenu de l'API)](/fr/reference/system/xasync/xasync_members)
  * Fonctions
    * [XAsyncRun](/fr/reference/system/xasync/functions/xasyncrun)
    * [XAsyncGetStatus](/fr/reference/system/xasync/functions/xasyncgetstatus)
    * [XAsyncCancel](/fr/reference/system/xasync/functions/xasynccancel)

## Voir aussi

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

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

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

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

[XAsyncProvider](/fr/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)
