> ## 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\*](/zh-TW/reference/system/xasync/structs/xasyncblock)

包含 **XGameSaveSubmitUpdateAsync** 呼叫之呼叫內容和回呼函式的 AsyncBlock。

### 傳回值

類型：HRESULT

函式結果

## 備註

此函式會作為 [XGameSaveSubmitUpdateAsync](/zh-TW/reference/system/xgamesave/functions/xgamesavesubmitupdateasync) 之 AsyncBlock 呼叫函式的一部分進行呼叫。此函式將用於判斷 [XGameSaveSubmitUpdateAsync](/zh-TW/reference/system/xgamesave/functions/xgamesavesubmitupdateasync) 的結果。

此 API 的儲存部分旨在以安全、可靠且交易式的方式，輕鬆地將資料從遊戲傳輸到永續性儲存體。我們希望確保容器的支援資料一律保持一致，因此希望整個作業以不可部分完成的方式成功或失敗。我們不希望發生部分更新，導致某些 Blob 資料與容器內的其他資料不一致。為了達成此目的，我們提供一個更新內容，Blob 的寫入和刪除會提交至此內容，待其準備就緒時再提交整個內容。實際上看起來如下：

XGameSaveUpdate 會透過 [XGameSaveSubmitBlobWrite](/zh-TW/reference/system/xgamesave/functions/xgamesavesubmitblobwrite) 和 [XGameSaveSubmitBlobDelete](/zh-TW/reference/system/xgamesave/functions/xgamesavesubmitblobdelete)，填入要對容器內 Blob 執行的寫入和刪除動作。呼叫 [XGameSaveSubmitUpdateAsync](/zh-TW/reference/system/xgamesave/functions/xgamesavesubmitupdateasync) 即可完成更新。

當您使用完 **XGameSaveUpdate** 時，請使用 [XGameSaveCloseUpdate](/zh-TW/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 主機

## 概念文件

* [非同步程式設計的設計目標與改進](/zh-TW/build/core-features/common/async/async-whitepaper)

## 另請參閱

[XGameSave](/zh-TW/reference/system/xgamesave/xgamesave_members)\
[XGameSaveCreateUpdate](/zh-TW/reference/system/xgamesave/functions/xgamesavecreateupdate)\
[XGameSaveSubmitBlobWrite](/zh-TW/reference/system/xgamesave/functions/xgamesavesubmitblobwrite)\
[XGameSaveSubmitBlobDelete](/zh-TW/reference/system/xgamesave/functions/xgamesavesubmitblobdelete)\
[偵錯遊戲存檔](/zh-TW/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)
