본문 바로가기
프로그래밍/C#

C# 비동기 프로그래밍 시작하기

by bantomak 2024. 10. 8.
반응형

C# 비동기 프로그래밍

C#에서는 async 키워드await 키워드를 사용하여 비동기 프로그래밍을 구현

await 작업이 이루어지는 경우 await 이후의 작업은 스레드 풀의 유휴 스레드를 할당받아 수행하게 된다.

async 키워드

해당 메서드 내에서 await 키워드를 사용할 수 있게 만들어 준다.

즉, await를 가지고 있을 수 있음을 알려주는 역할

  • 반드시 void / Task / Task<T> 중 하나를 반환해야 한다.
    • Task : 백그라운드 속성의 쓰레드, 스레드 풀 사용
  • void 사용시 비동기 메서드를 호출하는 쪽에서 비동기를 제어할 수 없다.

await 키워드

비동기 작업의 흐름을 제어하는 키워드

단항 연산자로 쓰이며 awaitable 형식(Task 또는 Task<T>를 반환하는 함수 또는 메서드)의 인수를 가짐

  • 피연산자의 비동기 작업이 완료될 때까지 바깥쪽 async 메서드의 실행을 일시 중단시킴
  • 비동기 작업의 리턴값이 있다면 작업 결과를 리턴
  • 이미 완료된 비동기 작업 피연사자에 적용시 async 메서드를 중단시키지 않고 결과 즉시 반환
  • 비동기 메서드를 실행하는 쓰레드를 블로킹하지 않음

비동기 예제

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

class Program
{
    public static async void TaskA() // 작업 A
    {
        int n = await Task.Run(() =>
        {
            Console.WriteLine($"Do TaskA, returns 10 (ThreadID:{Thread.CurrentThread.ManagedThreadId})");
            Thread.Sleep(2000); // 작업이 오래 걸리고 있는 중
            return 10;
        });
        Console.WriteLine($"Do TaskB with {n} from TaskA (ThreadID:{ Thread.CurrentThread.ManagedThreadId})");
        Console.WriteLine("비동기임에도 동기 처럼 사용되는 것을 보여 주기 위한 변수");
    }

    public static void Main()
    {
        TaskA();

        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine($"Main thread waits UI event..{i + 1} (ThreadID:{ Thread.CurrentThread.ManagedThreadId})");
            Thread.Sleep(1000);
        }

        Console.WriteLine("Program finished");
    }
}

참고 사이트

 

배경지식 - C#

비동기 프로그래밍 C#에서는 async과 await 키워드를 사용하여 비동기 프로그래밍을 구현 await 작업이 이루어지는 경우 await 이후의 작업은 쓰레드 풀의 유휴 쓰레드를 할당받아 수행하게됨 async 해

sueshin.tistory.com

댓글