본문 바로가기

C#/수업 내용

비동기 프로그래밍

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloWorld
{
    class Cook
    {
        //생성자
        public Cook()
        {
            Console.WriteLine("요리사가 생성되었습니다.");
        }

        public async Task Work()    //비동기 메서드
        {
            Coffee coffee = this.PourCoffee();
            Console.WriteLine("커피 완료");
            Task<Egg> eggsTask = this.FryEggsAsync(2);
            Egg eggs = await eggsTask;
            Console.WriteLine("후라이 완료");
            Task<Bacon> baconTask = this.FryBaconAsync(2);
            Bacon bacon = await baconTask;
            Console.WriteLine("베이컨 완료");
            //Task<Toast> toastTask = this.ToastBreadAsync();
            //Toast toast = await toastTask;
            //Task<Toast> toastTask = this.ToastBreadAsync();
            //Toast toast = await toastTask;

            Task<Toast> makeToastTask = this.MakeToastWithButterAndJamAsync();
            Toast toast = await makeToastTask;
            Console.WriteLine("토스트가 준비 되었습니다.");
            Console.WriteLine("토스트 완료");

            Juice juice = PourJuice();
            Console.WriteLine("주스 완료");
            Console.WriteLine("아침 준비완료");
        }

        public Coffee PourCoffee()
        {
            Console.WriteLine("커피를 따릅니다.");
            //커피 반환
            return new Coffee();
        }

        public async Task<Egg> FryEggsAsync(int howMany)
        {
            Console.WriteLine("팬을 데웁니다.");
            //3초 기다렸다가 
            await Task.Delay(3000);
            Console.WriteLine("{0}개의 달걀을 깨트립니다.", howMany);
            Console.WriteLine("계란후라이중...");
            //3초 기다렸다가
            await Task.Delay(3000);
            Console.WriteLine("접시에 담습니다.");
            //계란후라이 반환
            return new Egg();
        }

        async Task<Bacon> FryBaconAsync(int slices)
        {
            Console.WriteLine("{0}개의 베이컨들을 팬에 올려놓는다", slices);
            Console.WriteLine("앞면을 굽는다");
            //3초 있다가 뒷면을 굽는다
            await Task.Delay(3000);
            Console.WriteLine("뒤집어서 뒷면을 굽는다");
            //3초 있다가 접시에 놓는다
            await Task.Delay(3000);
            Console.WriteLine("베이컨을 접시에 올렸습니다.");
            //새로운 베이컨이 나온다
            return new Bacon();            
        }

        async Task<Toast> MakeToastWithButterAndJamAsync()
        {
            //빵을 토스트기에 넣고 나오면 버터 바르고 잼 바른다
            Toast toast = await ToastBreadAsync();
            this.ApplyButter(toast);
            this.ApplyJam(toast);
            return toast;
        }

        void ApplyJam(Toast toast)
        {
            Console.WriteLine("{0}에 잼을 바른다.", toast);
        }

        void ApplyButter(Toast toast)
        {
            Console.WriteLine("{0}에 버터를 바른다.", toast);
        }

        //람다 사용
        //void ApplyJam(Toast toast) => Console.WriteLine("{0}에 잼을 바른다.", toast);

        async Task<Toast> ToastBreadAsync()
        {
            Console.WriteLine("빵을 토스트기에 넣는다.");
            //3초 대기한다
            await Task.Delay(3000);
            Console.WriteLine("빵을 토스트기에서 꺼낸다.");
            return new Toast();
        }

        private Juice PourJuice()
        {
            Console.WriteLine("오렌지주스를 따른다");
            return new Juice();
        }
    }
}

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

세미 평가  (0) 2021.12.24
Task, Task<TResult>  (0) 2021.12.24
스레드  (0) 2021.12.24
반복기  (0) 2021.12.24
event  (0) 2021.12.24