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

**XGameSave** 서비스에 업데이트를 비동기적으로 제출합니다. 컨테이너 내의 Blob을 업데이트합니다.

## 구문

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

### 매개 변수

*updateContext*   \_In\_\
형식: XGameSaveUpdateHandle

업데이트할 XGameSaveUpdate에 대한 핸들입니다.

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

**XGameSaveSubmitUpdateAsync** 호출에 대한 호출 컨텍스트와 콜백 함수를 포함하는 AsyncBlock입니다.

### 반환값

형식: HRESULT

함수 결과

## 설명

이 함수는 [XGameSaveSubmitUpdateAsync](/reference/system/xgamesave/functions/xgamesavesubmitupdateasync)의 AsyncBlock 호출 함수의 일부로 호출됩니다. 이 함수는 [XGameSaveSubmitUpdateAsync](/reference/system/xgamesave/functions/xgamesavesubmitupdateasync)의 결과를 확인하는 데 사용됩니다.

이 API의 저장소 부분은 게임에서 지속적인 저장소로 안전하고 신뢰할 수 있으며 트랜잭션 방식으로 데이터를 쉽게 전송하도록 설계되었습니다. 컨테이너의 뒷단 데이터가 항상 일관되도록 하고자 하므로, 전체 작업이 원자적으로 성공하거나 실패하도록 하려고 합니다. 일부 Blob 데이터가 컨테이너 내의 다른 데이터와 일치하지 않는 부분 업데이트가 발생하지 않도록 합니다. 이를 위해 Blob 쓰기 및 삭제가 제출되는 업데이트 컨텍스트를 제공하고, 준비되면 전체 컨텍스트가 제출됩니다. 실제로는 다음과 같이 진행됩니다.

XGameSaveUpdate는 [XGameSaveSubmitBlobWrite](/reference/system/xgamesave/functions/xgamesavesubmitblobwrite) 및 [XGameSaveSubmitBlobDelete](/reference/system/xgamesave/functions/xgamesavesubmitblobdelete)를 통해 컨테이너 내의 Blob에서 수행할 쓰기 및 삭제 동작으로 채워집니다. [XGameSaveSubmitUpdateAsync](/reference/system/xgamesave/functions/xgamesavesubmitupdateasync)를 호출하여 업데이트를 완료합니다.

**XGameSaveUpdate** 사용을 완료하면 [XGameSaveCloseUpdate](/reference/system/xgamesave/functions/xgamesavecloseupdate) 메서드를 사용하여 닫습니다.

다음 C++ 샘플은 비동기 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; 
    } 
  
} 
```

## 요구 사항

**헤더:** XGameSave.h

**라이브러리:** xgameruntime.lib

**지원되는 플랫폼:** Windows, XBOX One 계열 콘솔 및 XBOX Series 콘솔

## 개념 설명서

* [비동기 프로그래밍 설계 목표 및 개선 사항](/build/core-features/common/async/async-whitepaper)

## 함께 보기

[XGameSave](/reference/system/xgamesave/xgamesave_members)\
[XGameSaveCreateUpdate](/reference/system/xgamesave/functions/xgamesavecreateupdate)\
[XGameSaveSubmitBlobWrite](/reference/system/xgamesave/functions/xgamesavesubmitblobwrite)\
[XGameSaveSubmitBlobDelete](/reference/system/xgamesave/functions/xgamesavesubmitblobdelete)\
[게임 저장 디버깅](/build/core-features/common/game-save/game-saves-debugging)


## Related topics

- [XGameSaveSubmitUpdateResult](/ko/reference/system/xgamesave/functions/xgamesavesubmitupdateresult.md)
- [XGameSave](/ko/reference/system/xgamesave/xgamesave_members.md)
- [XGameSaveCreateContainer](/ko/reference/system/xgamesave/functions/xgamesavecreatecontainer.md)
- [GDK용 Unity C# API 래퍼](/ko/build/gdk-and-engines/unity/unity-api-wrappers.md)
- [XGameSaveSubmitUpdate](/ko/reference/system/xgamesave/functions/xgamesavesubmitupdate.md)
