2023.03.27 - [C# 프로그래밍] - [C#] Task (1)
[C#] Task (1)
칩 제조사들은 cpu의 클럭 스피드를 올리는 것으로는 더 이상 물리적 한계에 부딪히게 되어 코어를 증가시키는 쪽으로 성능을 올렸습니다. 그렇기 때문에 성능 좋은 큰 프로그램을 만들려면 여
onesside-world.tistory.com
2023.03.27 - [C# 프로그래밍] - [C#] task (2)
[C#] task (2)
2023.03.27 - [C# 프로그래밍] - [C#] Task (1) [C#] Task (1) 칩 제조사들은 cpu의 클럭 스피드를 올리는 것으로는 더 이상 물리적 한계에 부딪히게 되어 코어를 증가시키는 쪽으로 성능을 올렸습니다. 그렇
onesside-world.tistory.com
- async 한정자
- async 한정자는 메소드, 이벤트 처리기, 태스크, 람다식 등을 수식합니다.
- C# 컴파일러가 async 한정자로 수식한 코드의 호출자를 만날 때 호출 결과를 기다리지 않고 바로 다음 코드로 이동하도록 실행 코드를 생성합니다.
이렇게 async 한정자로 메소드나 태스크를 수식하기만 하면 비동기코드가 만들어집니다.
다만, async로 한정하는 메소드는 반환 형식이 Task나 Task<TResult> 또는 void여야 합니다.
그러면 조금 정리해보자면
- async로 한정한 void 형식 메소드는 await 연산자가 없어도 비동기로 실행됩니다.
- async로 한정한 Task 또는 Task<TResult>를 반환하는 메소드, 태스크, 람다식은 await 연산자를 만나는 곳에서 호출자에게 제어를 돌려주며, await 연산자가 없는 경우 동기로 실행됩니다.
그러면 예제 코드를 보겠습니다.
using System;
using System.Threading.Tasks;
namespace Async
{
class MainApp
{
async static private void MyMethodAsync(int count)
{
Console.WriteLine("C");
Console.WriteLine("D");
await Task.Run(async () =>
{
for (int i = 1; i <= count; i++)
{
Console.WriteLine($"{i}/{count} ...");
await Task.Delay(1000);
}
});
Console.WriteLine("G");
Console.WriteLine("H");
}
static void Caller()
{
Console.WriteLine("A");
Console.WriteLine("B");
MyMethodAsync(3);
Console.WriteLine("E");
Console.WriteLine("F");
}
static void Main(string[] args)
{
Caller();
Console.ReadLine(); // 프로그램 종료 방지
}
}
}
코드의 비동기 흐름을 보겠습니다.
- 실행 결과

Caller() 메서드에서 MyMethodAsync(3)을 호출하면, MyMethodAsync()의 실행이 완료될 때까지 블로킹되지 않습니다. 따라서 E와 F가 MyMethodAsync()의 실행과 독립적으로 출력됩니다.

그리고 Task.Run() 메소드에 async 람다식이 들어가는 이유가 궁금하실 수 있습니다.
이유는 Task.Run()은 인자로 전달된 작업을 비동기적으로 실행하고, Task 객체를 반환합니다. 여기서는 Task.Run()의 인자로 async 람다식을 사용하고 있습니다.
이유는 이 람다식이 비동기 작업을 수행하기 때문입니다. 람다식 내부에서 await Task.Delay(1000); 코드를 사용하여 1초 동안 대기하는 작업을 비동기적으로 실행합니다. 이 때, Task.Delay() 메서드는 Task 객체를 반환하므로, await 키워드를 사용하여 이 Task 객체를 기다리게 됩니다.
따라서, Task.Run()의 인자로 async 람다식을 사용함으로써, 비동기적인 작업을 수행하고 해당 작업이 완료될 때까지 기다릴 수 있습니다.
'C# 프로그래밍' 카테고리의 다른 글
[C#] TCP/IP 네트워크 (2) (0) | 2023.03.29 |
---|---|
[C#] TCP/IP 네트워크 (1) (1) | 2023.03.28 |
[C#] task (2) (0) | 2023.03.27 |
[C#] Task (1) (1) | 2023.03.27 |
[C#] Action 대리자와 Func 대리자 (0) | 2023.03.16 |