async 한정자와 await 연산자

서병수·2023년 7월 17일
0

쓰레드와 테스크

목록 보기
4/5

23년 7월 18일
async로 한정한 메서드/테스크/람다식은 await 연산자를 만나는 곳에서 호출자에게 제어를 돌려주며, await연산자가 없으면 동기로 실행함.
async로 한정하려면 메서드,테스크,람다식은 반환형이 없거나 Task 또는Task<result>형이어야함

namespace asyncf
{
    internal class Program
    {
        async static private void MyMethodAsync(int count)
        {
            Console.WriteLine("C");
            Console.WriteLine("D");

            await Task.Run(async () =>
            {
                for(int i = 0; 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);
            Thread.Sleep(1000);
            Console.WriteLine("E");
            Console.WriteLine("F");
        }
        static void Main(string[] args)
        {
            Caller();
            Console.ReadLine();
        }
    }
}
  1. Caller()가 호출된다.
    2.MyMethodAsync에서 C,D까지는 동기로 호출하다가 await이후는 비동기로 호출함.
  2. Task.Delay() 함수는 Thread.Sleep()과 동일한 역할을 하지만 전자는 스레드를 블록하지 않고 후자는 스레드를 블록함.
profile
안녕하십니까 인사올립니다

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

뛰어난 글이네요, 감사합니다.

답글 달기