0329 Task/async/await

2021. 3. 29. 14:32C#/수업내용

public class App
    {
        Thread t;
        
        public App() 
        {
            //Action<object> action = (object obj) =>
            //  {
            //      Console.WriteLine("Task {0}, obj {1}, Thread {2}", Task.CurrentId, obj, Thread.CurrentThread.ManagedThreadId);
            //  };

            //Task t1 = new Task(action, "alpha");
            //t1.Start();
            //t1.Wait();

            //Task t2 = Task.Factory.StartNew(action, "beta");

            Task t=Task.Run(()=> {
                for (int i = 0; i < 100; i++) 
                {
                    Console.WriteLine("Test");
                    Task.Delay(1000);
                }
                
            });
            t.Wait();
        }
    }

 

 

docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/concepts/async/

await 키워드는 작업을 차단하지 않는 방식으로 시작한 다음, 해당 작업이 완료되면 실행을 계속합니다.

Egg eggs = await FryEggsAsync(2);

Console.WriteLine("eggs are ready");

 

대부분의 시나리오에서는 독립적인 몇 가지 작업을 즉시 시작하려고 합니다. 그런 다음, 각 작업이 완료되면 준비된 다른 작업을 계속할 수 있습니다.

 

앞의 메서드에서 해당 시그니처에는 async 한정자가 있습니다. 이 경우 이 메서드에서 비동기 작업이 포함된 await 문을 포함하고 있다고 컴파일러에 알립니다.

static async Task<Toast> MakeToastWithButterAndJamAsync(int number)
{
    var toast = await ToastBreadAsync(number);
    ApplyButter(toast);
    ApplyJam(toast);

    return toast;
}

 

 

public class Toast 
    {
        public Toast() { }
    }
    public class Egg
    {
        public Egg() { }
    }
    public class App
    {
        public App()
        { 
        }
        public async void Run() 
        {
            Task<Toast> toastTask = MakeToast(2);
            Task<Egg> eggTaks = FryEggs(2);

            var arr = new Task[] { toastTask, eggTaks }; //일 목록을 만들고
            var idx = Task.WaitAny(arr); //목록 중 어떤 것이든 완료되었다면 목록의 index를 반환
            Console.WriteLine("idx: {0}", idx); //완료된 인덱스 출력
            Console.WriteLine("{0} {1}", toastTask.Result, eggTaks.Result);

            //토스트를 만들어 배열에 담고 그 결과를 출력
            Toast[] toasts = await Task.FromResult(Enumerable.Range(1, 5).Select(x => new Toast()).ToArray());
            foreach (var toast in toasts)
            {
                Console.WriteLine(toast);
            }
        }
        private async Task<Egg> FryEggs(int howMany)
        {
            Console.WriteLine("팬을 달굽니다.");
            await Task.Delay(3000); //3초 대기
            Console.WriteLine($"팬 안에 달걀 {howMany}개를 넣습니다.");
            Console.WriteLine("계란을 조리 중입니다.");
            await Task.Delay(3000); //3초 대기
            Console.WriteLine("계란을 접시에 담습니다.");

            return new Egg();
        }
        private async Task<Toast> MakeToast(int howMany)
        {
            for (int i = 0; i < howMany; i++) {
                Console.WriteLine("토스트기에 빵을 넣었습니다.");
            }
            await Task.Delay(3000); //3초 대기
            Console.WriteLine("빵이 탔습니다.");
            await Task.Delay(3000); //3초 대기
            Console.WriteLine("빵을 꺼냈습니다.");

            return new Toast();
        }
    }

 

public class Egg {
        public string desc;
        public Egg(string desc) 
        { this.desc = desc; }
    }
        
    public class App
    {
        public App()
        { 
            //Task 변수 정의 (계란 삶기)
            //Task<Egg> taskEgg;

            //var egg = new Egg("생달걀");
            //Console.WriteLine(egg.desc);

            //Task 객체 생성 (일 정의)
            //taskEgg = this.BoilEgg(egg);

            //일 시작 > 일 끝날 때까지 대기
            Task<Egg> taskEgg = this.CookEgg(new Egg("생달걀"));
            taskEgg.Wait();

            //결과 확인
            Console.WriteLine(taskEgg.Result.desc);
        }
        public async Task<Egg> CookEgg(Egg egg)
        {
            var boilEgg=await BoilEgg(egg);
            return await SeasonEgg(boilEgg);
        }
        private async Task<Egg> BoilEgg(Egg egg) 
        {
            Console.WriteLine("달걀을 삶기 시작합니다.");
            await Task.Delay(1000);
            egg.desc = "삶은 달걀";
            Console.WriteLine("달걀이 삶아졌습니다.");
            return new Egg(egg.desc);
        }
        
        private async Task<Egg> SeasonEgg(Egg egg)
        {
            Console.WriteLine("달걀에 소금을 뿌립니다.");
            await Task.Delay(1000);
            egg.desc = "양념된 삶은 달걀";
            return egg;
        }
    }

'C# > 수업내용' 카테고리의 다른 글

0326 스레드  (0) 2021.03.26
0326 쿠키런 직렬화/역직렬화  (0) 2021.03.26
0325 싱글턴 패턴  (0) 2021.03.25
0324 File 클래스 (외부 파일 불러오기)  (0) 2021.03.24
0324 복습  (0) 2021.03.24