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

Envía de forma asincrónica una actualización al servicio **XGameSave**. Actualiza los blobs de un contenedor.

## Sintaxis

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

### Parámetros

*updateContext*   \_In\_\
Tipo: XGameSaveUpdateHandle

Identificador del XGameSaveUpdate que se va a actualizar.

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

AsyncBlock que contiene el contexto de llamada y la función de devolución de llamada para la llamada a **XGameSaveSubmitUpdateAsync**.

### Valor devuelto

Tipo: HRESULT

Resultado de la función

## Comentarios

Se llama a esta función como parte de la función de llamada del AsyncBlock de [XGameSaveSubmitUpdateAsync](/reference/system/xgamesave/functions/xgamesavesubmitupdateasync). Esta función se usará para determinar los resultados de [XGameSaveSubmitUpdateAsync](/reference/system/xgamesave/functions/xgamesavesubmitupdateasync).

La parte de almacenamiento de esta API está diseñada para transferir fácilmente datos del juego al almacenamiento persistente de forma segura, fiable y transaccional. Queremos asegurarnos de que los datos de respaldo de un contenedor sean siempre coherentes y, por ello, queremos que toda la operación se realice correctamente o falle de forma atómica. No queremos tener una actualización parcial en la que algunos datos de blob sean incoherentes con otros datos del contenedor. Para ello, proporcionamos un contexto de actualización al que se envían las escrituras y eliminaciones de blobs y, cuando está listo, se envía todo el contexto. En la práctica, esto tiene el siguiente aspecto:

Un XGameSaveUpdate se rellenará con acciones de escritura (Write) y eliminación (Delete) que se llevarán a cabo en los blobs del contenedor mediante [XGameSaveSubmitBlobWrite](/reference/system/xgamesave/functions/xgamesavesubmitblobwrite) y [XGameSaveSubmitBlobDelete](/reference/system/xgamesave/functions/xgamesavesubmitblobdelete). Una actualización se completa llamando a [XGameSaveSubmitUpdateAsync](/reference/system/xgamesave/functions/xgamesavesubmitupdateasync).

Cuando termine con un **XGameSaveUpdate**, ciérrelo mediante el método [XGameSaveCloseUpdate](/reference/system/xgamesave/functions/xgamesavecloseupdate).

En el siguiente ejemplo de C++ se muestra una actualización asincrónica de XGameSave.

```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; 
    } 
  
} 
```

## Requisitos

**Encabezado:** XGameSave.h

**Biblioteca:** xgameruntime.lib

**Plataformas compatibles:** Windows, consolas de la familia XBOX One y consolas XBOX Series

## Documentación conceptual

* [Objetivos de diseño y mejoras de la programación asincrónica](/build/core-features/common/async/async-whitepaper)

## Consulte también

[XGameSave](/reference/system/xgamesave/xgamesave_members)\
[XGameSaveCreateUpdate](/reference/system/xgamesave/functions/xgamesavecreateupdate)\
[XGameSaveSubmitBlobWrite](/reference/system/xgamesave/functions/xgamesavesubmitblobwrite)\
[XGameSaveSubmitBlobDelete](/reference/system/xgamesave/functions/xgamesavesubmitblobdelete)\
[Depuración de partidas guardadas](/build/core-features/common/game-save/game-saves-debugging)


## Related topics

- [XGameSaveSubmitUpdateResult](/es/reference/system/xgamesave/functions/xgamesavesubmitupdateresult.md)
- [XGameSave](/es/reference/system/xgamesave/xgamesave_members.md)
- [XGameSaveCreateContainer](/es/reference/system/xgamesave/functions/xgamesavecreatecontainer.md)
- [Contenedores de API de C# de Unity para el GDK](/es/build/gdk-and-engines/unity/unity-api-wrappers.md)
- [XGameSaveSubmitUpdate](/es/reference/system/xgamesave/functions/xgamesavesubmitupdate.md)
