Overview : async
메서드에 다음에 await
가 반드시 있어야 합니다.
1. Console 에서 async await 구현
비동기 코드 수행을 기다리기.
샘플 vs2017
비고) vs2019 이상은 System.Threading.Tasks 자동 지원
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
using System; using System.Threading.Tasks; using System.Threading; namespace Console { class Program { static void Main(string[] args) { MainAsync(args).GetAwaiter().GetResult(); //Consol 비동기 돌리는 방법 Console.ReadLine(); } static async Task MainAsync(string[] args) //비동기 { Task k = Fryeggs(); // 계란 만들기 Task k2 = Frybacon(); // 베이컨 만들기 Console.WriteLine("▶ 비동기 메소드◎♤ 2개를 요청하자 마자 바로 여기로 이동 \r\n"); Console.WriteLine("◎ 달걀프라이 만들기 ♨ 시작 \r\n"); Console.WriteLine("♤ 베 이 컨 만들기 ♨ 시작 \r\n"); await k; //async 가 있으면 await 가 있어야 함. await k2;// 만들기를 완료후 진행 합니다. Console.WriteLine("\r\n ☆ 만들기 모두 종료된 후 수행 ☆ \r\n"); } //달걀 플라이 public static async Task Fryeggs() { await Task.Run(() => { for (int i = 0; i < 5; i++) { Thread.Sleep(1000); Console.WriteLine("{0} {1}", "◎ 달걀프라이 만들기", i ); } }); Console.WriteLine("◎◎◎◎◎ 달걀프라이 만들기 끝"); } //베이컨 프라이 public static async Task Frybacon() { await Task.Run(() => { for (int i = 0; i < 5; i++) { Thread.Sleep(1000); Console.WriteLine("{0} {1}", "♤ 베 이 컨 만들기", i); } }); Console.WriteLine("♤♤♤♤♤ 베 이 컨 만들기 끝"); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
▶ 비동기 메소드◎♤ 2개를 요청하자 마자 바로 여기로 이동 ◎ 달걀프라이 만들기 ♨ 시작 ♤ 베 이 컨 만들기 ♨ 시작 ◎ 달걀프라이 만들기 0 ♤ 베 이 컨 만들기 0 ♤ 베 이 컨 만들기 1 ◎ 달걀프라이 만들기 1 ♤ 베 이 컨 만들기 2 ◎ 달걀프라이 만들기 2 ♤ 베 이 컨 만들기 3 ◎ 달걀프라이 만들기 3 ♤ 베 이 컨 만들기 4 ◎ 달걀프라이 만들기 4 ♤♤♤♤♤ 베 이 컨 만들기 끝 ◎◎◎◎◎ 달걀프라이 만들기 끝 ☆ 만들기 모두 종료된 후 수행 ☆ |
2. Console 에서 async void 구현
: 비동기 코드 수행을 기다리지 않기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
using System; using System.Threading.Tasks; using System.Threading; namespace Console { class Program { static void Main(string[] args) { //MainAsync(args).GetAwaiter().GetResult(); //Consol 비동기 돌리는 방법 MainAsync(args); Console.ReadLine(); } private static async void MainAsync(string[] args) //비동기 { Task k = Fryeggs(); // 계란 만들기 Task k2 = Frybacon(); // 베이컨 만들기 Console.WriteLine("▶ 비동기 메소드◎♤ 2개를 요청하자 마자 바로 여기로 이동 \r\n"); Console.WriteLine("◎ 달걀프라이 만들기 ♨ 시작 \r\n"); Console.WriteLine("♤ 베 이 컨 만들기 ♨ 시작 \r\n"); //await k; //async 가 있으면 await 가 있어야 함. //await k2;// 만들기를 완료후 진행 합니다. Console.WriteLine("\r\n ☆ 만들기 모두 종료된 후 수행 ☆ \r\n"); Console.ReadLine(); } public static async Task Fryeggs() { await Task.Run(() => { for (int i = 0; i < 5; i++) { Thread.Sleep(1000); Console.WriteLine("{0} {1}", "◎ 달걀프라이 만들기", i ); } }); Console.WriteLine("◎◎◎◎◎ 달걀프라이 만들기 끝"); } public static async Task Frybacon() { await Task.Run(() => { for (int i = 0; i < 5; i++) { Thread.Sleep(1000); Console.WriteLine("{0} {1}", "♤ 베 이 컨 만들기", i); } }); Console.WriteLine("♤♤♤♤♤ 베 이 컨 만들기 끝"); } |
경고 CS1998 이 비동기 메서드에는 ‘await’ 연산자가 없으며 메서드가 동시에 실행됩니다.
‘await’ 연산자를 사용하여 비블로킹 API 호출을 대기하거나, ‘await Task.Run(…)’을 사용하여 백그라운드 스레드에서 CPU 바인딩된 작업을 수행하세요.
함수 MainAsync 에서 async 삭제 하면 경고 오류 없음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
▶ 비동기 메소드◎♤ 2개를 요청하자 마자 바로 여기로 이동 ◎ 달걀프라이 만들기 ♨ 시작 ♤ 베 이 컨 만들기 ♨ 시작 ☆ 만들기 모두 종료된 후 수행 ☆ ◎ 달걀프라이 만들기 0 ♤ 베 이 컨 만들기 0 ♤ 베 이 컨 만들기 1 ◎ 달걀프라이 만들기 1 ◎ 달걀프라이 만들기 2 ♤ 베 이 컨 만들기 2 ♤ 베 이 컨 만들기 3 ◎ 달걀프라이 만들기 3 ♤ 베 이 컨 만들기 4 ◎ 달걀프라이 만들기 4 ♤♤♤♤♤ 베 이 컨 만들기 끝 ◎◎◎◎◎ 달걀프라이 만들기 끝 |
2. Console 에서 async await 구현에서
async 비동기 메소드의 결과값 리턴하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
using System; using System.Threading.Tasks; using System.Threading; namespace Console { class Program { static void Main(string[] args) { MainAsync(args).GetAwaiter().GetResult(); //Consol 비동기 돌리는 방법 //MainAsync(args); Console.ReadLine(); } private static async Task MainAsync(string[] args) //비동기 { Task<int> k = Fryeggs(); // 계란 만들기 Task<int> k2 = Frybacon(); // 베이컨 만들기 Console.WriteLine("▶ 비동기 메소드◎♤ 2개를 요청하자 마자 바로 여기로 이동 \r\n"); Console.WriteLine("◎ 달걀프라이 만들기 ♨ 시작 \r\n"); Console.WriteLine("♤ 베 이 컨 만들기 ♨ 시작 \r\n"); //await k; //async 가 있으면 await 가 있어야 함. //await k2;// 만들기를 완료후 진행 합니다. //Console.WriteLine("\r\n ☆ 만들기 모두 종료된 후 수행 ☆ \r\n"); int ik = await k; int ik2 = await k2; Console.WriteLine("{0} 달걀프라이{1}개 , 베이컨 {2}개", "\r\n ☆ 리턴 값은 ☆ \r\n", ik , ik2); //Console.ReadLine(); } public static async Task<int> Fryeggs() { int iRet = 0; await Task.Run(() => { for (int i = 0; i < 5; i++) { Thread.Sleep(1000); Console.WriteLine("{0} {1}", "◎ 달걀프라이 만들기", i ); iRet = iRet + 1; } }); Console.WriteLine("◎◎◎◎◎ 달걀프라이 만들기 끝"); return iRet; } public static async Task<int> Frybacon() { int iRet = 0; await Task.Run(() => { for (int i = 0; i < 5; i++) { Thread.Sleep(1000); Console.WriteLine("{0} {1}", "♤ 베 이 컨 만들기", i); iRet = iRet + 1; } }); Console.WriteLine("♤♤♤♤♤ 베 이 컨 만들기 끝"); return iRet; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
▶ 비동기 메소드◎♤ 2개를 요청하자 마자 바로 여기로 이동 ◎ 달걀프라이 만들기 ♨ 시작 ♤ 베 이 컨 만들기 ♨ 시작 ◎ 달걀프라이 만들기 0 ♤ 베 이 컨 만들기 0 ♤ 베 이 컨 만들기 1 ◎ 달걀프라이 만들기 1 ◎ 달걀프라이 만들기 2 ♤ 베 이 컨 만들기 2 ◎ 달걀프라이 만들기 3 ♤ 베 이 컨 만들기 3 ♤ 베 이 컨 만들기 4 ◎ 달걀프라이 만들기 4 ♤♤♤♤♤ 베 이 컨 만들기 끝 ◎◎◎◎◎ 달걀프라이 만들기 끝 ☆ 리턴 값은 ☆ 달걀프라이5개 , 베이컨 5개 |