비동기 프로그래밍 시작

완료됨

개발자는 비동기 프로그래밍 기술을 사용하여 성능 병목 상태를 방지하고 애플리케이션의 전반적인 응답성을 향상시킵니다. 그러나 비동기 애플리케이션을 작성하는 기존의 기술은 복잡할 수 있으므로 작성, 디버그 및 유지 관리가 어려울 수 있습니다.

C#은 .NET 런타임에서 비동기 지원을 활용하는 간소화된 비동기 프로그래밍 방법을 지원합니다. 컴파일러는 개발자가 수행하는 데 사용한 어려운 작업을 수행하며 애플리케이션은 동기 코드와 유사한 논리 구조를 유지합니다. 결과적으로 비동기 프로그래밍의 모든 장점을 약간의 노력으로 얻을 수 있습니다.

실제 환경에서 비동기 프로세스가 작동하는 방식을 이해하면 애플리케이션에서 비동기 프로그래밍을 사용하는 방법을 이해하는 데 도움이 될 수 있습니다.

실제 환경에서 비동기 프로세스 검사

아침 식사를 만드는 것은 비동기적으로 작업을 수행하는 이점을 활용하는 프로세스의 좋은 예입니다. 아침 식사를 동기적으로 또는 비동기적으로 수행할 수 있는 일련의 작업으로 생각할 수 있습니다.

  1. 식료품 저장실에서 아침 식사 재료를 가져옵니다.
  2. 커피 한 잔을 붓습니다.
  3. 팬을 가열한 다음 베이컨 세 조각을 튀깁니다.
  4. 계란 2개를 튀깁니다.
  5. 빵 두 조각을 토스트합니다.
  6. 토스트에 버터와 잼을 퍼뜨리세요.
  7. 오렌지 주스 한 잔을 붓습니다.

요리 경험이 있는 경우 이러한 지침을 비동기적으로 완료할 수 있습니다. 당신은 베이컨과 계란을 위한 팬을 예열한 다음, 식료품 저장실에서 재료를 가져옵니다. 빵을 토스터에 넣고 베이컨을 요리하기 시작합니다. 프로세스의 각 단계에서 작업을 시작한 다음 주의할 준비가 된 다른 작업으로 전환합니다.

아침 식사를 요리하는 것은 병렬이 아닌 비동기 작업의 좋은 예입니다. 한 사람(또는 스레드)이 모든 작업을 처리할 수 있습니다. 한 사람은 이전 작업이 완료되기 전에 다음 작업을 시작하여 아침 식사를 비동기적으로 만들 수 있습니다. 각 요리 작업은 누군가가 프로세스를 적극적으로 보고 있는지 여부에 관계없이 진행됩니다. 팬을 데우는 즉시 식료품 저장실에서 재료를 얻을 수 있습니다. 베이컨이 요리하기 시작하면 빵을 토스터에 넣을 수 있습니다.

병렬 알고리즘의 경우 요리하는 여러 사람(또는 여러 스레드)이 필요합니다. 한 사람은 계란을 요리하고, 다른 사람은 베이컨을 튀깁니다. 각 사용자는 하나의 특정 작업에 중점을 둡니다. 요리하는 각 사람(또는 각 스레드)은 현재 작업이 완료될 때까지 동기적으로 차단됩니다. 예를 들어, 베이컨은 뒤집힐 준비가 되어 있고, 빵은 토스터에서 튀어나올 준비가 되어 있습니다.

비동기 프로그래밍 기술을 사용하면 여러 작업을 한 번에 수행하여 아침 식사를 보다 효율적으로 만드는 방법과 마찬가지로 애플리케이션의 효율성과 응답성을 향상시킬 수 있습니다.

비동기 처리가 응답성을 향상시킵니다.

비동기는 웹 액세스와 같이 잠재적으로 차단되는 활동에 필수적입니다. 웹 리소스에 대한 액세스가 느리거나 지연되는 경우가 있습니다. 동기 프로세스에서 이러한 작업이 차단되면 전체 애플리케이션이 기다려야 합니다. 비동기 프로세스에서 애플리케이션은 잠재적으로 차단된 작업이 완료될 때까지 웹 리소스에 의존하지 않는 다른 작업을 계속할 수 있습니다.

다음 표에서는 비동기 프로그래밍이 응답성을 향상시키는 일반적인 영역을 보여 줍니다. .NET 및 Windows 런타임의 나열된 API에는 비동기 프로그래밍을 지원하는 메서드가 포함되어 있습니다.

애플리케이션 영역 비동기 메서드를 사용한 .NET 형식 비동기 메서드를 사용하는 Windows 런타임 형식
웹 액세스 HttpClient Windows.Web.Http.HttpClient, SyndicationClient
파일 작업 JsonSerializer, StreamReader, StreamWriter 등 StorageFile
이미지 작업 MediaCapture, BitmapEncoder, BitmapDecoder
WCF 프로그래밍 동기 및 비동기 작업

비동기 메서드를 만들고 호출하는 방법

C#에서는 asyncawait 키워드를 사용하여 구현된 비동기 작업입니다. 키 async 워드는 비동기 메서드를 정의하는 데 사용되지만 await 키워드는 호출 스레드를 차단하지 않고 비동기 메서드를 호출하고 결과를 기다리는 데 사용됩니다. 비동기 작업은 일반적으로 대기할 수 있는 진행 중 작업을 나타내는 Task 또는 Task<T> 형식을 사용하여 구현됩니다.

다음은 C#에서 비동기 작업을 만들고 호출하는 방법의 예입니다.


using System;
using System.IO;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main()
    {
        string filePath = "example.txt";
        string content = await ReadFileAsync(filePath);
        Console.WriteLine(content);
    }

    public static async Task<string> ReadFileAsync(string filePath)
    {
        using (StreamReader reader = new StreamReader(filePath))
        {
            string content = await reader.ReadToEndAsync();
            return content;
        }
    }
}

이 예제에서는 메서드가 ReadFileAsync 키워드를 async 사용하여 정의되고 반환 형식이 Task<string>있습니다. 키워드는 async 메서드에 비동기 작업이 포함되어 있음을 나타내며 반환 형식 Task<string> 은 메서드가 비동기 작업을 나타내는 작업을 반환한다는 것을 나타냅니다. 형식은 Task<string> 문자열 값을 반환하는 비동기 작업을 나타내는 제네릭 작업입니다. 이 메서드는 ReadFileAsync 파일 경로를 매개 변수로 사용하고 파일 내용을 비동기적으로 읽습니다.

Main 메서드는 비동기적으로 정의되므로 ReadFileAsync 키워드를 사용하여 await 메서드를 호출할 수 있습니다. 이 await 키워드는 프로그램이 계속하기 전에 비동기 작업의 결과를 기다려야 함을 나타내는 데 사용됩니다. 이 경우 프로그램은 콘솔에 콘텐츠를 인쇄하기 전에 파일을 읽을 때까지 기다립니다.

요약

이 단원에서는 비동기 프로그래밍의 이점과 애플리케이션의 응답성을 향상시키는 방법에 대해 알아보았습니다. 또한 asyncawait 키워드를 사용하여 C#에서 비동기 메서드를 만들고 호출하는 방법도 배웠습니다. 이러한 기술을 사용하면 사용자 인터페이스를 동결하거나 다른 작업을 차단하지 않고 잠재적으로 차단 작업을 처리할 수 있는 보다 효율적이고 응답성이 뛰어난 애플리케이션을 작성할 수 있습니다.

핵심 사항

  • 비동기 프로그래밍은 애플리케이션 성능과 응답성을 향상시킵니다.
  • C#은 비동기 프로그래밍에 대한 간소화된 접근 방식을 제공합니다.
  • 비동기 프로그래밍은 웹 액세스와 같은 활동을 잠재적으로 차단하는 데 유용합니다.
  • C#에서는 async 키워드를 사용하여 비동기 메서드를 만들고, await 키워드를 사용하여 호출합니다.
  • Task 또는 Task<T> 유형은 C#에서 대기할 수 있는 진행 중인 작업을 나타냅니다.