비동기 프로그래밍

이 항목에서는 UWP(유니버설 Windows 플랫폼)의 비동기 프로그래밍 및 C#, Microsoft Visual Basic .NET, C++, JavaScript에서의 표현에 대해 설명합니다.

비동기 프로그래밍을 사용하면 앱이 시간이 오래 걸리는 작업을 시행시 응답성을 유지할 수 있습니다. 예를 들어 인터넷에서 콘텐츠를 다운로드하는 앱은 콘텐츠가 도착할 때까지 몇 초 동안 대기할 수 있습니다. UI 스레드에서 동기 메서드를 사용하여 콘텐츠를 추출한 경우 메서드가 출력될 때까지 앱이 차단됩니다. 앱은 사용자 상호 작용에 반응하지 않을 것이며 응답하지 않는 것처럼 보이기 때문에 사용자가 불만을 느낄 수 있습니다. 훨씬 더 괜찮은 방법은 작업이 완료되기를 기다리는 동안 앱이 계속 실행되고 UI에 응답하는 비동기 프로그래밍을 사용하는 것입니다.

완료하는 데 시간이 오래 걸릴 수 있는 메서드의 경우 비동기 프로그래밍은 UWP만의 예외가 아니라 기본입니다. JavaScript, C#, Visual Basic 및 C++ 각각은 비동기 메서드에 언어 지원을 제공합니다.

UWP 비동기 프로그래밍

많은 UWP 기능(예: MediaCapture API 및 StorageFile API)은 비동기 API로 표시됩니다. 규칙에 따라 비동기 API의 이름은 제어 권한이 호출자에게 반환된 후 실행 부분이 진행될 수 있음을 나타내는 “Async”로 끝납니다.

UWP(유니버설 Windows 플랫폼) 앱에서 비동기 API를 사용하는 경우 코드는 일관되게 비차단 호출을 시행합니다. 사용자 고유의 API 정의에서 이러한 비동기 패턴을 구현하는 경우 호출자는 예측 가능한 방식으로 코드를 이해하고 사용할 수 있습니다.

다음은 비동기 Windows 런타임 API를 호출해야 하는 일반적인 작업의 예입니다.

  • 메시지 대화 상자 표시

  • 파일 시스템 작업, 파일 선택기 표시

  • 인터넷에서 데이터 보내고 받기

  • 소켓, 스트림, 연결성 사용하기

  • 약속, 연락처, 일정 작업하기

  • PDF(이식 가능한 문서 형식) 파일 열기 또는 이미지 또는 미디어 형식 디코딩과 같은 파일 형식 작업하기

  • 디바이스 혹은 서비스와 상호 작용

UWP 비동기 패턴을 사용하면 스레드를 명시적으로 관리하지 않는 것이 가능합니다. 각 프로그래밍 언어는 각각 고유한 방식으로 UWP에 대한 비동기 패턴을 지원합니다.

프로그래밍 언어 비동기 표현방식
C# async 키워드, await 연산자
Visual Basic Async 키워드, Await 연산자
C++/WinRT 코루틴 및 co_await 연산자
C++/CX 테스크 클래스, .then 메서드
JavaScript promise 개체, then 함수

C# 및 Visual Basic을 사용하는 UWP의 비동기 패턴들

C# 또는 Visual Basic으로 작성된 코드의 일반적인 세그먼트는 동기적으로 실행됩니다. 즉, 한 라인이 실행되면 다음 라인이 실행되기 전에 해당 라인 작업이 완료됩니다. 이전의 비동기 실행을 위한 Microsoft .NET 프로그래밍 모델들이 있었지만, 출력되는 코드는 코드가 수행하려는 작업에 집중하는 대신 비동기 코드 실행 메커니즘을 강조하는 경향이 있습니다. UWP, .NET Framework 및 C# 및 Visual Basic 컴파일러에는 코드에 비동기 메커니즘을 추상화하는 기능이 추가되었습니다. .NET 및 UWP의 경우 코드 실행 방법과 시기 대신 수행하는 작업에 중점을 둔 비동기 코드를 작성할 수 있습니다. 비동기 코드는 동기 코드와 흡사합니다. 비동기 API에 대한 자세한 내용은 C# 또는 Visual Basic에서 비동기 API 호출을 참조하세요.

C++/WinRT로 작성된 UWP의 비동기 패턴

C + +/WinRT를 사용하는 경우 코루틴 및 co_await 연산자를 사용합니다. 자세한 내용과 코드 예제는 C++/WinRT의 비동기 프로그래밍을 참조하세요.

C++/CX로 작성된 UWP의 비동기 패턴

C++/CX에서 비동기 프로그래밍은 태스크 클래스, 그리고 then 메서드를 기반으로 합니다. 구문은 JavaScript promise의 구문과 유사합니다. 태스크 클래스 및 관련 형식은 스레드 컨텍스트의 취소 및 관리를 위한 기능도 제공합니다. 자세한 내용은 의 비동기 프로그래밍을 참조하세요.

create_async 함수는 JavaScript 또는 UWP를 지원하는 다른 언어에서 사용할 수 있는 비동기 API 작성에 대한 지원을 제공합니다. 자세한 내용은 로 비동기 작업 만들기룰 참조하세요.

JavaScript를 사용하는 UWP의 비동기 패턴들

JavaScript에서 비동기 프로그래밍은 비동기 메서드가 promise 개체를 반환하게 하여 공통 JS Promise/A 제안 표준을 따릅니다. Promise는 JavaScript용 UWP 및 Windows 라이브러리 모두에서 사용됩니다.

promise 개체는 나중에 실현될 값을 나타냅니다. UWP에서는 관습에 따라 "Async"로 끝나는 이름이 있는 팩터리 함수에서 promise 개체를 가져옵니다.

대부분의 경우 비동기 함수를 호출하는 것은 기존의 함수를 호출하는 것만큼 간단합니다. 차이점은 결과 또는 오류 처리기를 할당하고 작업을 시작하기 위해 then 혹은 done 메서드를 사용한다는 것입니다.