반응형
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# 비동기 프로그래밍 APM이란 무엇인가? (0) | 2024.11.21 |
---|---|
C# 프로그램 진입점 Main함수가 static인 이유 (1) | 2024.11.19 |
C# HttpClient.PostAsync 사용하기 (0) | 2024.10.07 |
C# HTTP 프로토콜과 Web 사용 (0) | 2024.10.02 |
IEnumerable vs IQueryable 어떻게 다른지 알아보자 (0) | 2024.09.25 |
댓글