C#/C# 교과서

[C# 교과서] 56. 비동기 프로그래밍

서니션 2023. 2. 9. 15:41
728x90
반응형

C#에서는 async와 await 키워드를 사용하여 아주 쉽게 비동기 프로그램 구현 가능

 

동기 : 프로그램이 순서대로 실행됨을 의미. 프로그램은 기본적으로 동기로 실행 됨.

비동기 : 메서드 여러 개를 동시에 실행하거나 대기 시점을 변경하여 순서를 재정의할 수 있음

 

동기는 실행하는 동안 스레드가 차다되는 차단 코드를 나타냄.

비동기는 스레드가 차단되지 않는 비차단 코드를 나타냄.


동기 프로그래밍

비주얼 스튜디오의 디버거 기능을 사용하여 F10을 여러 번 누르면 코드가 호출한 순서대로 실행

동기 프로그램은 지금까지 우리가 사용한 메서드 호출 순서대로 실행되는 것


비동기 프로그래밍

쉽게 말해 한 번에 여러 작업을 수행할 수 있도록 도와주는 기능

 

파일, 데이터베이스, 네트워크 등에서 데이터를 가져올 때 시간이 오래 걸림 -> I/O 바인딩된 코드

CPU 사용량이 많은 코드 -> CPU 바인딩된 코드

 

비동기 프로그래밍은 이러한 I/O 바인딩된 코드와 CPU 바인딩된 코드를 유용하게 다룰 수 있음


비동기 메인 메서드

다음 코드는 Main()메서드에 async Task 형태를 붙여 비동기 메서드로 만들고,

닷넷 API에서 제공하는 Task.Delay() 메서드를 await 키워드를 붙여 비동기로 호출하는 내용

Task.Delay() 메서드는 비동기 메서드 안에서 지정한 밀리초만큼 대기

using System;
using System.Threading.Tasks;

class AsyncMain
{
    static async Task Main()
    {
        await Task.Delay(1000);
        Console.WriteLine("비동기 메인 메서드");
    }
}

 

 async : 비동기 메서드 표시

await : 현재 코드를 실행할 때까지 대기, 스레드의 Start() 메서드 호출이 필요하지 않음

 

!! 초간단 !!

비동기 메서드의 시그니처에는 async를 붙이고 메서드 본문에는 await 키워드를 사용하여 비동기 메서드를 호출


닷넷에 이미 만들어 둔 HttpClient 클래스를 사용하면 특정 웹 사이트 또는 RESTFul 서비스인 Web API를 호출해서 그 결괏값을 가져올 수 있음

HttpClient 클래스의 GetAsync()와 ReadAsStringAsync()는 모두 비동기 메서드이기에 호출할 때 await를 앞에 붙이고 호출

닷넷의 모든 비동기 메소드는 Async 접미사를 붙임

 

비동기 메서드의 반환값은 Task, Task<T> 형태


Task.Run() 메서드로 비동기 메서드 호출

동기 메서드 내에서 비동기 메서드를 호출할 때는 Task.Run() 메서드를 사용

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

class ex
{
    static void Main()
    {
        Task.Run(()=> DoPrint());
        Console.WriteLine("[?] async await 사용 예제");
        Thread.Sleep(1);
    }

    static async void DoPrint()
    {
        await PrintNumberAsync();
    }

    static async Task PrintNumberAsync()
    {
        await Task.Run(() =>
        {
            for (int i=0; i<300; i++)
            {
                Console.WriteLine(i+1);
            }
        });
    }
}

이 코드는 Main()에서 Task.Run 메서드로 비동기 메서드인 DoPrint()를 사용하는 내용을 보여줌

마찬가지로 Task.Run() 메서드 앞에 await 키워드를 붙여 비동기 메서드로 만드는 내용을 PrintNumberAsync() 메서드에 표현


Task.FromResult()를 사용하여 비동기로 반환값 전달하기

자신만의 비동기 메서드를 만들 때 특정 결괏값을 Task<T>로 돌려주면 Task.FromResult()메서드로 묶음

동기를 포함한 비동기 프로그램도 역시 비동기 프로그램


728x90
반응형