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

# 비동기 프로그래밍 설계 목표 및 개선 사항

> 비동기 프로그래밍 설계 목표 및 개선 사항

이 항목에서는 Microsoft Game Development Kit(GDK)를 위한 새로운 비동기 프로그래밍 모델을 만들 때 설정한 설계 목표를 다룹니다. 또한 이 항목에서는 개발자 피드백에 대응하여 XBOX One Software Development Kit 모델에서 이루어진 개선 사항을 다룹니다.

## 이 항목의 내용

* [소개](#introduction)
* [설계 목표](#design_goals)
  * [일관되고 크로스 플랫폼](#consistent_cross_platform)
  * [완전한 개발자 제어](#complete_developer_control)
  * [모든 스레딩 상황](#any_threading_situation)
* [XBOX One Software Development Kit로부터의 개선 사항](#improvements_from_xdk)
  * [더 이상 C++/CLI 없음](#no_more_ccli_winrt)
  * [스레딩 동작에 대한 완전한 제어](#complete_control_of_threading_behavior)
  * [예외 대신 오류 코드](#error_codes_instead_of_exceptions)
  * [가비지 컬렉션 없음](#no_garbage_collection)
  * [보장된 고성능](#guaranteed_high_performance)
    * [시간에 민감한 스레드](#time_sensitive_threads)
  * [Microsoft Game Development Kit(GDK) API 호출을 넘어선 일반적인 사용](#generic_usage_beyond_gdk_api_calls)

## 소개

Microsoft Game Development Kit(GDK)는 낮은 처리 및 메모리 오버헤드를 유지하면서 고도로 사용자 지정 및 제어할 수 있는 실행 동작을 제공하도록 설계된 새로운 비동기 프로그래밍 모델을 도입했습니다. Microsoft Game Development Kit(GDK)의 모든 비동기 API 호출은 일관성을 제공하기 위해 이 모델을 사용합니다. 그러나 비동기 라이브러리는 작업 큐잉 및 디스패치를 관리하기 위해 사용자 고유의 작업 및 비동기 시스템에서 직접 사용할 수 있습니다.

이전 XBOX One Software Development Kit 비동기 모델과 개발자 피드백으로부터 배운 Microsoft Game Development Kit(GDK)의 새로운 솔루션은 비동기 작업이 실행되는 방식과 위치를 완벽하게 제어할 수 있게 해 줍니다. 단일 스레드의 동기 실행이든 매우 특정한 우선 순위와 어피니티 마스크를 가진 타이틀 스레드에서의 병렬 실행이든 모든 스레딩 설계를 사용할 수 있습니다. XBOX One Software Development Kit는 시스템 스레드 풀만 사용했습니다.

Microsoft Game Development Kit(GDK)의 패러다임 전환은 Win32 스타일의 플랫 C 또는 간단한 C++ API를 사용하여 XBOX One Software Development Kit 솔루션을 개선합니다. 이를 통해 메모리 할당 및 해제 타이밍을 직접 관리할 수 있습니다. 성능을 더 쉽게 검사할 수 있으며, 대부분의 API 호출(및 작업 실행에 사용되는 모든 비동기 라이브러리 API 호출)에는 [고성능 보장](#guaranteed_high_performance)이 함께 제공됩니다.

## 설계 목표

비동기 라이브러리는 타이틀이 API 또는 시스템의 최소 오버헤드로 최대 성능을 얻을 수 있도록 몇 가지 핵심 목표를 가지고 설계되었습니다. 다음 목록에는 몇 가지 상위 수준의 목표가 포함되어 있습니다.

* 비동기 코드는 일관되며 이해하고 식별하기 쉽습니다.
* 콜백 실행 동작을 자유롭게 완전히 관리할 수 있습니다.
* 원하는 방식으로 스레드를 사용할 수 있습니다.
* 성능과 메모리 사용량이 일관되고 관리하기 쉽습니다.
* 작업 실행을 위한 시스템 오버헤드가 낮고 주 스레드에서 사용할 수 있습니다.
* 비동기 라이브러리는 Microsoft Game Development Kit(GDK) API 사용에만 국한되어서는 안 됩니다.

이러한 목표 중 일부는 다음 하위 섹션에서 다루며, 다른 목표는 이 항목의 [XBOX One Software Development Kit로부터의 개선 사항](#improvements_from_xdk) 섹션에서 다룹니다.

### 일관되고 크로스 플랫폼

일관성은 비동기 API가 작성되고 작동하는 방식에 대해 다음과 같은 기대치를 제공합니다.

* 메서드와 데이터는 `X` 접두사와 라이브러리 이름을 갖습니다.
* [일반 오류는 HRESULT 오류 코드를 통해 보고됩니다](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/overviews/error-handling).
* Microsoft Game Development Kit(GDK) 전체의 모든 비동기 호출은 [XAsyncBlock](/ko/reference/system/xasync/structs/xasyncblock)을 사용합니다.
* 비동기 Microsoft Game Development Kit(GDK) 시작 메서드는 `Async` 접미사를 갖습니다.
* 비동기 Microsoft Game Development Kit(GDK) 결과 메서드는 `Result` 접미사를 갖습니다.

크로스 플랫폼이라는 것은 Microsoft Game Development Kit(GDK)가 대상으로 하는 모든 플랫폼에서 동일한 비동기 API 호출을 사용할 수 있음을 의미합니다. 이러한 플랫폼에는 현재 [Windows PC(NDA 항목)](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/intro/introduction#shipping-a-game-on-Windows-PCs), [XBOX One 제품군 콘솔 및 XBOX Series 콘솔(NDA 항목)](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/intro/introduction#Shipping-a-game-on-Xbox-consoles)이 포함됩니다.

Microsoft Game Development Kit(GDK) API 호출용으로 비동기 라이브러리를 사용하든, 자체 기능을 사용하든, [XAsyncBlock 설정](/ko/build/core-features/common/async/async-libraries/async-library-xasync-example-setup-async-task) 및 [비동기 메서드 시작](/ko/build/core-features/common/async/async-libraries/async-library-xasync-example-run-simple-task) 프로세스는 항상 동일합니다. 라이브러리에서 비동기 메서드를 제공할 때마다 해당 메서드는 구현을 위해 비동기 라이브러리를 사용합니다. 다음 표는 비동기 메서드를 노출하는 몇 가지 라이브러리를 보여 줍니다.

| 라이브러리 | 비동기 사용 사례 | 예제 메서드 |
| - | - | - |
| [XUser](/ko/reference/system/xuser/xuser_members) | XBOX 서비스 사용자 관리 | [XUserAddAsync](/ko/reference/system/xuser/functions/xuseraddasync), [XUserAddResult](/ko/reference/system/xuser/functions/xuseraddresult), [XUserGetGamerPictureAsync](/ko/reference/system/xuser/functions/xusergetgamerpictureasync), [XUserGetGamerPictureResult](/ko/reference/system/xuser/functions/xusergetgamerpictureresult) |
| [XGameSave](/ko/reference/system/xgamesave/xgamesave_members) | 게임 저장 데이터 읽기, 쓰기, 관리 | [XGameSaveInitializeProviderAsync](/ko/reference/system/xgamesave/functions/xgamesaveinitializeproviderasync), [XGameSaveInitializeProviderResult](/ko/reference/system/xgamesave/functions/xgamesaveinitializeproviderresult), [XGameSaveSubmitUpdateAsync](/ko/reference/system/xgamesave/functions/xgamesavesubmitupdateasync), [XGameSaveSubmitUpdateResult](/ko/reference/system/xgamesave/functions/xgamesavesubmitupdateresult) |
| [XPackage](/ko/reference/system/xpackage/xpackage_members) | 게임 설치 관찰 및 관리 | [XPackageInstallChunksAsync](/ko/reference/system/xpackage/functions/xpackageinstallchunksasync), [XPackageInstallChunksResult](/ko/reference/system/xpackage/functions/xpackageinstallchunksresult) |
| [XGameUI](/ko/reference/system/xgameui/xgameui_members) | 시스템 대화상자 및 기타 셸 UI 사용 | [XGameUiShowMessageDialogAsync](/ko/reference/system/xgameui/functions/xgameuishowmessagedialogasync), [XGameUiShowMessageDialogResult](/ko/reference/system/xgameui/functions/xgameuishowmessagedialogresult), [XGameUiShowSendGameInviteAsync](/ko/reference/system/xgameui/functions/xgameuishowsendgameinviteasync), [XGameUiShowSendGameInviteResult](/ko/reference/system/xgameui/functions/xgameuishowsendgameinviteresult) |

### 완전한 개발자 제어

새로운 비동기 라이브러리의 중요한 부분은 타이틀에 가장 적합한 사용을 활성화할 수 있도록 완전한 제어권을 가진다는 것입니다. 즉, 다음을 포함한 모델의 많은 부분이 사용자 지정 가능합니다.

* 작업 큐의 콜백을 자동 또는 수동으로 디스패치할 수 있습니다.
* 완료 콜백은 선택 사항이며 폴링을 사용할 수 있습니다.
* 기본 프로세스 작업 큐를 [변경하거나 제거](/ko/reference/system/xtaskqueue/functions/xtaskqueuesetcurrentprocesstaskqueue)할 수 있습니다.
* [사용자 지정 비동기 공급자](/ko/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-custom-provider)를 구현하여 [작업 관리 흐름](/ko/build/core-features/common/async/async-libraries/async-library-xasyncprovider)을 변경할 수 있습니다.

작업 큐가 [만들어질](/ko/reference/system/xtaskqueue/functions/xtaskqueuecreate) 때, 다음 표와 같이 두 포트에 대한 콜백이 디스패치되는 방식을 [사용자 지정](/ko/reference/system/xtaskqueue/enums/xtaskqueuedispatchmode)할 수 있습니다.

| 포트 모드 | 동작 |
| - | - |
| `ThreadPool` | 큐잉된 콜백이 시스템 풀 스레드에서 백그라운드로 자동 및 동시에 디스패치됩니다. |
| `SerializedThreadPool` | 큐잉된 콜백이 시스템 풀 스레드에서 백그라운드로 자동 디스패치됩니다. 그러나 한 번에 하나의 콜백만 활성화될 수 있어 겹침 없이 직렬 실행을 보장합니다. |
| `Immediate` | 콜백은 나중에 큐잉되지 않고 큐잉을 시도할 때 호출자의 스택 프레임에서 즉시 실행됩니다. 작업 포트가 `Immediate`이면 비동기 호출을 시작할 때 작업 콜백이 실행됩니다. 완료 포트가 `Immediate`이면 완료 콜백은 동일한 스택 프레임에서 작업 콜백이 완료된 후에 실행됩니다. |
| `Manual` | 이 모드의 포트에 큐잉된 콜백은 자동으로 디스패치되지 않습니다. 포트에서 콜백을 수동으로 실행하려면 [XTaskQueueDispatch](/ko/reference/system/xtaskqueue/functions/xtaskqueuedispatch)를 호출해야 합니다. 호출 패턴에 따라 콜백의 스레딩 및 동시성이 결정됩니다. |

작업 큐가 지정되지 않았을 때 타이틀에서 사용하는 기본 작업 큐는 [XTaskQueueSetCurrentProcessTaskQueue](/ko/reference/system/xtaskqueue/functions/xtaskqueuesetcurrentprocesstaskqueue)를 사용하여 대체할 수 있습니다. 작업 큐가 항상 지정되도록 하려면 `nullptr`과 함께 해당 함수를 사용하여 기본 큐를 제거할 수도 있습니다. 이 경우 작업 큐가 지정되지 않으면 오류가 발생합니다.

작업이 완료될 때를 알기 위해 비동기 호출에 폴링을 사용하는 것을 선호하는 경우, [XAsyncGetStatus](/ko/reference/system/xasync/functions/xasyncgetstatus)를 사용하여 반환 코드를 확인할 수 있습니다.

### 모든 스레딩 상황

작업 큐 포트가 수동 디스패치를 사용하도록 구성된 경우 포트가 언제 어떻게 디스패치되는지에 대한 제한이 없습니다. 비동기 라이브러리는 구현에서 스레드로부터 안전하므로 잠금 없이 사용자 지정 스레딩 및 동시성 동작이 발생할 수 있습니다. 크리티컬 섹션, 인터록된 작업 및 기타 관련 다중 스레딩 구문은 비동기 시스템이 아닌 콜백 내에서 사용되는 사용자 데이터를 보호하는 데만 필요합니다.

자체 스레드를 사용하는 경우 구현 사례에 필요한 어떤 것이든 어피니티 마스크와 스레드 우선 순위를 설정할 수 있습니다. Windows 메시지 루프를 사용하여 디스패치를 처리할 수도 있습니다. 수동 포트 내의 태스크 콜백 실행 동작은 그림 1 및 그림 2와 같이 [XTaskQueueDispatch](/ko/reference/system/xtaskqueue/functions/xtaskqueuedispatch)를 호출하도록 스레드가 설정된 방식에 완전히 의존합니다.

**그림 1. 하나의 스레드의 콜백 실행 동작을 보여 줍니다**

![하나의 스레드의 콜백 실행 동작 스크린샷](https://mintcdn.com/microsoft-4404708b/sIrPFR_ir_sNKVEv/images/gdk/features/common/async_port_dispatch_singlethread.png?fit=max\&auto=format\&n=sIrPFR_ir_sNKVEv\&q=85\&s=bceacfdac6d7a8a6bd58641ac4c604c0)

**그림 2. 여러 스레드의 콜백 실행 동작을 보여 줍니다**

![여러 스레드의 콜백 실행 동작 스크린샷](https://mintcdn.com/microsoft-4404708b/sIrPFR_ir_sNKVEv/images/gdk/features/common/async_port_dispatch_multithread.png?fit=max\&auto=format\&n=sIrPFR_ir_sNKVEv\&q=85\&s=697aae48e97cb3aa23845108060a1882)

## XBOX One Software Development Kit로부터의 개선 사항

[여러분의 피드백에 대응하고 과거 솔루션을 개선하는 것은 Microsoft Game Development Kit(GDK)에 매우 중요합니다(NDA 항목)](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/intro/introduction). 다음 하위 섹션에서는 XBOX One Software Development Kit의 비동기 프로그래밍과 비교하여 이루어진 몇 가지 주요 개선 사항을 나열합니다.

### 더 이상 C++/CLI(WinRT) 없음

XBOX One Software Development Kit는 비동기 함수 동작을 위해 C++/CLI(WinRT) 사용을 요구했습니다. 이를 통해 시스템은 리소스 누수 및 오류와 같은 문제를 겪지 않고 XBOX 서비스 및 기타 서비스에 대한 호출을 관리했습니다. 그러나 이는 또한 새로운 코딩 구문을 배우고 시스템의 암묵적인 시간 분할 및 리소스 사용을 고려해야 했습니다.

[Microsoft Game Development Kit(GDK) 비동기 모델](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/intro/introduction#microsoft-game-development-kit-gdk-async-model)은 비동기 라이브러리에 대해 Win32 스타일의 C 스타일 API 모델로 패러다임을 전환합니다. Microsoft Game Development Kit(GDK) 코드는 관리되는 WinRT 생태계를 통합하지 않고도 C/C++ 프로젝트에서 직접 사용할 수 있습니다. 결과적으로 모든 할당과 동작은 격리되고 잘 이해되며 시스템 스레드의 백그라운드 동작이 최소화됩니다.

### 스레딩 동작에 대한 완전한 제어

XBOX One Software Development Kit는 비동기 호출을 처리하는 단일 방법이 있었고, 그것은 시스템 풀 스레드에서 동시에 실행하는 것이었습니다. 제어 범위는 시스템 스레드 풀을 조정하는 것으로 제한되었습니다.

Microsoft Game Development Kit(GDK)에서 스레딩은 XBOX One Software Development Kit에서 설명한 대로 시스템 스레드 풀을 사용하거나, 애플리케이션에 대한 동작을 구축하도록 수동 스레딩으로 사용자 지정할 수 있습니다. 수동 스레딩에서는 [XTaskQueueDispatch](/ko/reference/system/xtaskqueue/functions/xtaskqueuedispatch)가 호출되는 방식과 시기에 따라 콜백 실행 동작이 결정됩니다. 이 함수가 하나의 스레드에서만 호출되면 해당 스레드에서 실행되는 동기 동작이 됩니다. 여러 스레드가 동시에 이 함수를 호출하면 각 호출은 작업 큐에서 다른 콜백을 받고 병렬로 실행합니다.

여러 콜백 실행 동작은 이 항목의 [완전한 개발자 제어](#complete_developer_control) 섹션에서 설명했습니다.

### 예외 대신 오류 코드

Microsoft Game Development Kit(GDK)는 새로운 기술과 오래된 기술을 모두 아우릅니다. 결과적으로 오류 처리는 라이브러리마다 다를 수 있습니다. 비동기 라이브러리는 "예외 없음"으로 설계되었습니다. 즉, 호출 오류, 흐름 제어, 상태 보고 또는 다른 런타임 목적에 예외가 사용되지 않습니다. 타이틀에서 자체 예외 처리를 사용할 수 있습니다.

대부분의 오류 및 상태 코드는 이제 표준 Win32 코딩 스타일에서 `HRESULT` 코드를 통해 보고됩니다. 결과 상태 코드가 중요하지 않은 경우 부울(Boolean)을 사용할 수 있습니다. API 메서드가 일반적인 오류를 생성할 것으로 예상되는 경우, 해당 오류는 원인에 대한 설명과 함께 문서에 나열됩니다.

`HRESULT` 코드가 사용되므로 코드를 확인하는 간단한 패턴은 Windows `SUCCESS()` 및 `FAILED()` 매크로를 사용하는 것입니다. 진행 방법을 결정하기 위해 특정 오류 코드를 확인할 때 `HRESULT` 값을 확인할 수 있습니다.

Microsoft Game Development Kit(GDK)의 오류 처리에 대한 자세한 내용은 [Microsoft Game Development Kit의 오류 처리](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/overviews/error-handling)를 참조하세요.

### 가비지 컬렉션 없음

Microsoft Game Development Kit(GDK)에는 C++/CLI(WinRT) 지원이 없기 때문에 런타임 동안 백그라운드에서 발생하는 가비지 컬렉션도 없습니다. 추적되는 모든 OS 할당은 직접 `HANDLE` 개체 또는 라이브러리에서 제공하는 사용자 지정 핸들 [typedef](https://learn.microsoft.com/cpp/c-language/typedef-declarations?view=msvc-160)로 표현됩니다.

핸들을 사용하여 할당/해제 타이밍, 동작 및 성능이 호출자에 의해 관리되도록 설정할 수 있습니다. 이러한 할당과 해제는 성능 히치를 피하기 위해 지원 로더 스레드로 이동할 수 있습니다. 성능이 가장 중요할 때 예기치 않게 해제가 발생하지 않습니다.

그러나 리소스 추적과 메모리 누수 방지는 사용자의 책임이 됩니다. 할당된 핸들이 더 이상 필요하지 않을 때는 반드시 해제해야 합니다.

### 보장된 고성능

XBOX One Software Development Kit 비동기 모델은 관리되는 COM 프레임워크를 사용함으로써 때때로 설명하기 어려운 예기치 않은 메모리 및 성능 문제로 이어지는 경향이 있었습니다. 그러나 Microsoft Game Development Kit(GDK) 모델은 일관된 성능과 메모리 사용량을 보장합니다.

스레딩을 제어할 수 있기 때문에 프로파일러나 사용자 지정 코드를 사용하여 시스템 호출의 성능을 더 쉽게 검사할 수 있습니다. ATG 비동기 프로그래밍 샘플에는 소요된 시간의 일부를 측정하기 위한 기본 제공 테스트가 있습니다. 그림 3의 차트는 사용자 지정 비동기 공급자로 비동기 작업을 관리하는 데 소요된 시간을 측정합니다. 테스트에 사용되는 사용자 지정 스레드는 콜백을 가능한 한 빠르게 실행합니다.

**그림 3. 비동기 시스템 오버헤드를 측정하는 차트를 보여 줍니다**

![비동기 시스템 오버헤드를 측정하는 차트의 스크린샷](https://mintcdn.com/microsoft-4404708b/sIrPFR_ir_sNKVEv/images/gdk/features/common/async_system_overhead.png?fit=max\&auto=format\&n=sIrPFR_ir_sNKVEv\&q=85\&s=f3b502ebab1ac4271107b2bbc70c390c)

시스템 오버헤드는 매우 낮습니다. 오버헤드 비용은 주로 스레드가 작업 큐 포트를 디스패치할 때까지 대기하는 동안 발생합니다. 오버헤드 비용을 무시한 전체 비동기 작업 시간은 작업의 콜백 내에서의 실제 작업입니다.

#### 시간에 민감한 스레드

[시간에 민감한 스레드](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads)는 Microsoft Game Development Kit(GDK)가 차단이나 예기치 않게 오래 실행되는 작업을 원하지 않는 타이틀 스레드를 식별하기 위해 사용하는 새로운 사양입니다. 사용자는 [XThreadSetTimeSensitive](/ko/reference/system/xthread/functions/xthreadsettimesensitive) 호출로 타이틀 스레드를 시간에 민감한 것으로 표시할 수 있습니다. 스레드가 시간에 민감한 것으로 표시되면 일관되고 신뢰할 수 있는 런타임 성능을 제공하지 않는(즉, "시간에 민감하며 안전"하지 않은) 해당 스레드의 모든 Microsoft Game Development Kit(GDK) API 메서드 호출은 디버그 어설션을 트리거합니다.

이러한 시간에 민감하며 안전한 메서드에는 구현 측면에서 다음과 같은 보장이 포함됩니다.

* 온디맨드 로드나 초기화가 수행되지 않습니다.
* VM 또는 프로세스 경계를 넘는 호출이 이루어지지 않습니다.
* 메모리 할당이 제한됩니다.

이를 통해 시간에 민감하며 안전한 메서드는 동일한 입력으로 일관된 시간 내에 실행되며 예기치 않게 성능이 급증하지 않습니다. 많은 Microsoft Game Development Kit(GDK) 메서드는 내부적으로 시간에 민감하며 안전으로 표시되며, 시간에 민감하며 안전한 메서드를 호출할 때 보장을 얻기 위해 스레드가 시간에 민감한 것으로 표시될 필요는 없습니다.

대부분의 비동기 API 메서드는 시간에 민감하며 안전합니다. 그렇지 않은 것들은 작업 큐 설정 및 일반적으로 로드 또는 초기화 시점에 호출되는 다른 저빈도 호출과 관련이 있습니다. 비동기 작업을 시작, 관리, 취소, 완료 또는 그 외의 방법으로 직접 다루는 모든 메서드는 시간에 민감하며 안전합니다. 안전하지 않은 함수에 대한 자세한 내용은 시간에 민감한 스레드 항목의 [시간에 민감한 스레드에 대한 안전하지 않은 함수](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads#unsafe-function-list) 섹션을 참조하세요.

### Microsoft Game Development Kit(GDK) API 호출을 넘어선 일반적인 사용

Microsoft Game Development Kit(GDK)용 비동기 라이브러리는 일반적이며 API 호출 사용에만 국한되지 않습니다. Microsoft Game Development Kit(GDK)에서 제공하는 모든 비동기 호출은 내부적으로 비동기 라이브러리를 사용하며 작업 시작 및 결과 가져오기를 포함한 작업에 대해 [일관된 메서드](#consistent_cross_platform)를 제공합니다. GDK가 아닌 API 목적으로 라이브러리를 사용하는 방법에 대한 자세한 내용은 [샘플 코드](/ko/build/core-features/common/async/async-libraries/async-library-xasync-example-run-simple-task)를 참조하세요.

이 설정에서 [비동기 작업 시작](/ko/build/core-features/common/async/async-libraries/async-library-xasync-example-run-simple-task)은 Microsoft Game Development Kit(GDK) 함수든 사용자 지정 패턴이든 동일한 프로세스입니다. 작업을 위해 [XAsyncBlock이 설정](/ko/build/core-features/common/async/async-libraries/async-library-xasync-example-setup-async-task)된 다음 작업이 시작됩니다. 작업 시작은 Microsoft Game Development Kit(GDK) API 함수이거나 사용자 지정 타이틀 메서드일 수 있습니다.

타이틀 전반에 걸쳐 어떤 비동기 목적으로든 비동기 라이브러리를 자유롭게 사용하세요.

## 참고 API 문서

* [XAsync(API 콘텐츠)](/ko/reference/system/xasync/xasync_members)
  * 함수
    * [XAsyncGetStatus](/ko/reference/system/xasync/functions/xasyncgetstatus)
  * 구조체
    * [XAsyncBlock](/ko/reference/system/xasync/structs/xasyncblock)
* [XAsyncProvider(API 콘텐츠)](/ko/reference/system/xasyncprovider/xasyncprovider_members)
* [XTaskQueue(API 콘텐츠)](/ko/reference/system/xtaskqueue/xtaskqueue_members)
  * 함수
    * [xtaskqueuesetcurrentprocesstaskqueue](/ko/reference/system/xtaskqueue/functions/xtaskqueuesetcurrentprocesstaskqueue)
    * [xtaskqueuecreate](/ko/reference/system/xtaskqueue/functions/xtaskqueuecreate)
    * [XTaskQueueDispatch](/ko/reference/system/xtaskqueue/functions/xtaskqueuedispatch)
* [xuser(API 콘텐츠)](/ko/reference/system/xuser/xuser_members)
  * 함수
    * [XUserAddAsync](/ko/reference/system/xuser/functions/xuseraddasync)
    * [XUserAddResult](/ko/reference/system/xuser/functions/xuseraddresult)
    * [XUserGetGamerPictureAsync](/ko/reference/system/xuser/functions/xusergetgamerpictureasync)
    * [XUserGetGamerPictureResult](/ko/reference/system/xuser/functions/xusergetgamerpictureresult)
* [xgamesave(API 콘텐츠)](/ko/reference/system/xgamesave/xgamesave_members)
  * 함수
    * [XGameSaveInitializeProviderAsync](/ko/reference/system/xgamesave/functions/xgamesaveinitializeproviderasync)
    * [XGameSaveInitializeProviderResult](/ko/reference/system/xgamesave/functions/xgamesaveinitializeproviderresult)
    * [XGameSaveSubmitUpdateAsync](/ko/reference/system/xgamesave/functions/xgamesavesubmitupdateasync)
    * [XGameSaveSubmitUpdateResult](/ko/reference/system/xgamesave/functions/xgamesavesubmitupdateresult)
* [xpackage(API 콘텐츠)](/ko/reference/system/xpackage/xpackage_members)
  * 함수
    * [XPackageInstallChunksAsync](/ko/reference/system/xpackage/functions/xpackageinstallchunksasync)
    * [XPackageInstallChunksResult](/ko/reference/system/xpackage/functions/xpackageinstallchunksresult)
* [xgameui(API 콘텐츠)](/ko/reference/system/xgameui/xgameui_members)
  * 함수
    * [XGameUiShowMessageDialogAsync](/ko/reference/system/xgameui/functions/xgameuishowmessagedialogasync)
    * [XGameUiShowMessageDialogResult](/ko/reference/system/xgameui/functions/xgameuishowmessagedialogresult)
    * [XGameUiShowSendGameInviteAsync](/ko/reference/system/xgameui/functions/xgameuishowsendgameinviteasync)
    * [XGameUiShowSendGameInviteResult](/ko/reference/system/xgameui/functions/xgameuishowsendgameinviteresult)
* [xthread(API 콘텐츠)](/ko/reference/system/xthread/xthread_members)
  * 함수
    * [XThreadSetTimeSensitive](/ko/reference/system/xthread/functions/xthreadsettimesensitive)

## 참고 항목

[비동기 프로그래밍 모델](/ko/build/core-features/common/async/async-programming-model)
[작업 큐 설계](/ko/build/core-features/common/async/async-task-queue-design)


## Related topics

- [비동기 프로그래밍 모델](/ko/build/core-features/common/async/async-programming-model.md)
- [XAsync (API 콘텐츠)](/ko/reference/system/xasync/xasync_members.md)
- [XAsyncProvider (API 콘텐츠)](/ko/reference/system/xasyncprovider/xasyncprovider_members.md)
- [XAsyncGetStatus](/ko/reference/system/xasync/functions/xasyncgetstatus.md)
- [비동기 프로그래밍 개요(콘텐츠)](/ko/build/core-features/common/async/async-toc.md)
