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

# XGameSaveSubmitUpdateAsync

> XGameSaveSubmitUpdateAsync

# XGameSaveSubmitUpdateAsync

Soumet une mise à jour au service **XGameSave** de manière asynchrone. Met à jour les blobs d'un conteneur.

## Syntaxe

```cpp theme={null}
HRESULT XGameSaveSubmitUpdateAsync(  
         XGameSaveUpdateHandle updateContext,  
         XAsyncBlock* async  
)  
```

### Paramètres

*updateContext*   \_In\_\
Type : XGameSaveUpdateHandle

Handle vers le XGameSaveUpdate à mettre à jour.

*async*   \_In\_\
Type : [XAsyncBlock\*](/fr/reference/system/xasync/structs/xasyncblock)

AsyncBlock contenant le contexte d'appel et la fonction de rappel de l'appel à **XGameSaveSubmitUpdateAsync**.

### Valeur de retour

Type : HRESULT

Résultat de la fonction

## Remarques

Cette fonction est appelée dans le cadre de la fonction d'appel AsyncBlock de [XGameSaveSubmitUpdateAsync](/fr/reference/system/xgamesave/functions/xgamesavesubmitupdateasync). Elle permet de déterminer les résultats de [XGameSaveSubmitUpdateAsync](/fr/reference/system/xgamesave/functions/xgamesavesubmitupdateasync).

La partie stockage de cette API est conçue pour transférer facilement les données du jeu vers un stockage persistant de manière sûre, fiable et transactionnelle. Nous voulons garantir que les données sous-jacentes d'un conteneur restent toujours cohérentes ; c'est pourquoi l'opération entière doit réussir ou échouer de manière atomique. Nous ne voulons pas de mise à jour partielle dans laquelle certaines données de blob seraient incohérentes avec d'autres données du conteneur. Pour ce faire, nous fournissons un contexte de mise à jour auquel les écritures et suppressions de blobs sont soumises, puis, lorsqu'il est prêt, le contexte entier est soumis. En pratique, cela se présente comme suit :

Un XGameSaveUpdate est rempli d'actions d'écriture (Write) et de suppression (Delete) à effectuer sur les blobs du conteneur au moyen de [XGameSaveSubmitBlobWrite](/fr/reference/system/xgamesave/functions/xgamesavesubmitblobwrite) et [XGameSaveSubmitBlobDelete](/fr/reference/system/xgamesave/functions/xgamesavesubmitblobdelete). Une mise à jour est finalisée en appelant [XGameSaveSubmitUpdateAsync](/fr/reference/system/xgamesave/functions/xgamesavesubmitupdateasync).

Lorsque vous avez terminé avec un **XGameSaveUpdate**, fermez-le à l'aide de la méthode [XGameSaveCloseUpdate](/fr/reference/system/xgamesave/functions/xgamesavecloseupdate).

L'exemple C++ suivant illustre une mise à jour XGameSave asynchrone.

```cpp theme={null}
// ASYNC Write - can be kicked off from a time sensitive thread 
//               actual work and completion will be scheduled base upon 
//               the configuration of the async_queue tied to the XAsyncBlock. 
void Sample::_SaveDataAsync(const char* containerName, const char* containerDisplayName) 
{ 
    struct SaveContext 
    { 
        SaveContext(Sample* s) : self(s), containerContext(nullptr), updateContext(nullptr) {} 
        ~SaveContext() 
        { 
            if (updateContext) 
            { 
                XGameSaveCloseUpdate(updateContext); 
            } 
            if (containerContext) 
            { 
                XGameSaveCloseContainer(containerContext); 
            } 
        } 
  
        XAsyncBlock async; 
        XGameSaveContainerHandle containerContext; 
        XGameSaveUpdateHandle updateContext; 
        Sample* self; 
    }; 
  
    HRESULT hr; 
    SaveContext* saveContext = new SaveContext(this); 
    if (saveContext == nullptr) 
    { 
        hr = E_OUTOFMEMORY; 
    } 
    if (SUCCEEDED(hr)) 
    { 
        saveContext->async.context = saveContext; 
        saveContext->async.callback = [](XAsyncBlock* async) 
        { 
            auto ctx = reinterpret_cast<SaveContext*>(async->context); 
            auto self = ctx->self; 
            HRESULT hr = XGameSaveSubmitUpdateResult(async); 
            self->_HandleContainerUpdateErrors(hr); 
            delete ctx; 
        }; 
    } 
  
    if (SUCCEEDED(hr)) 
    { 
        hr = XGameSaveCreateContainer(_provider, containerName, &saveContext->containerContext); 
    } 
    if (SUCCEEDED(hr)) 
    { 
        hr = XGameSaveCreateUpdate(saveContext->containerContext, containerDisplayName, &saveContext->updateContext); 
    } 
  
    if (SUCCEEDED(hr)) 
    { 
        hr = XGameSaveSubmitBlobWrite(saveContext->updateContext, "WorldState", _worldState.data(), _worldState.size()); 
    } 
    if (SUCCEEDED(hr)) 
    { 
        hr = XGameSaveSubmitBlobWrite(saveContext->updateContext, "PlayerState", _playerState.data(), _playerState.size()); 
    } 
    if (SUCCEEDED(hr)) 
    { 
        hr = XGameSaveSubmitBlobWrite(saveContext->updateContext, "PlayerInventory", _playerInventory.data(), _playerInventory.size()); 
    } 
    if (SUCCEEDED(hr)) 
    { 
        if (_clearLevelProgress) 
        { 
            hr = XGameSaveSubmitBlobDelete(saveContext->updateContext, "LevelProgress"); 
        } 
    } 
    if (SUCCEEDED(hr)) 
    { 
        hr = XGameSaveSubmitUpdateAsync(saveContext->updateContext, &saveContext->async); 
    } 
    if (SUCCEEDED(hr)) 
    { 
        // context is now owned by the async 
        saveContext = nullptr; 
    } 
  
    // if there was any error we need to cleanup the saveContext 
    if (saveContext) 
    { 
        delete saveContext; 
    } 
  
} 
```

## Configuration requise

**En-tête :** XGameSave.h

**Bibliothèque :** xgameruntime.lib

**Plateformes prises en charge :** Windows, consoles de la famille XBOX One et consoles XBOX Series

## Documentation conceptuelle

* [Objectifs de conception et améliorations de la programmation asynchrone](/fr/build/core-features/common/async/async-whitepaper)

## Voir aussi

[XGameSave](/fr/reference/system/xgamesave/xgamesave_members)\
[XGameSaveCreateUpdate](/fr/reference/system/xgamesave/functions/xgamesavecreateupdate)\
[XGameSaveSubmitBlobWrite](/fr/reference/system/xgamesave/functions/xgamesavesubmitblobwrite)\
[XGameSaveSubmitBlobDelete](/fr/reference/system/xgamesave/functions/xgamesavesubmitblobdelete)\
[Débogage des sauvegardes de jeu](/fr/build/core-features/common/game-save/game-saves-debugging)


## Related topics

- [XGameSaveSubmitUpdateAsync](/ko/reference/system/xgamesave/functions/xgamesavesubmitupdateasync.md)
- [XGameSaveSubmitUpdateResult](/reference/system/xgamesave/functions/xgamesavesubmitupdateresult.md)
- [XGameSave](/reference/system/xgamesave/xgamesave_members.md)
- [Asynchronous programming design goals and improvements](/build/core-features/common/async/async-whitepaper.md)
- [XGameSaveCreateContainer](/reference/system/xgamesave/functions/xgamesavecreatecontainer.md)
