이번 포스팅에서는 비동기식으로 동작하는 Task 사용법과 그 예제를 다룹니다.
1. 비동기? 동기?
동기식이란 간단히 작업의 직렬 수행이며, 순차적으로 진행됨을 뜻합니다.비동기식이란 동기식과는 반대로 병렬로의 작업 수행을 뜻합니다.
2. 예제 코드 및 설명
각 Task 변수들에 Sleep(1000) 간격으로 Console출력하는 Action 델리게이트를 동작 시킵니다.
using System; using System.Threading; using System.Threading.Tasks; namespace ExerciseConsole01 { class Program { static void Main() { // Task가 수행할 내용 Action<object> action = (object obj) => { try { Console.WriteLine("Task={0}, obj={1}, Thread={2}", Task.CurrentId, obj, Thread.CurrentThread.ManagedThreadId); for (int i = 0; i < 3; i++) { Thread.Sleep(1000); Console.WriteLine(string.Format("Running Thread [{0}] ... {1} ", Task.CurrentId, i)); } Console.WriteLine(string.Format("Finish Thread [{0}]", Task.CurrentId)); } catch (Exception ex) { Console.WriteLine("Exception : " + ex.Message.ToString()); } }; // # 유형 01 Task t1 = new Task(action, "alpha"); t1.Start(); // # 유형 02 Task t2 = Task.Factory.StartNew(action, "beta"); // # 유형 03 String taskData = "delta"; Task t3 = Task.Run(() => { Console.WriteLine("Task={0}, obj={1}, Thread={2}", Task.CurrentId, taskData, Thread.CurrentThread.ManagedThreadId); for (int i = 0; i < 3; i++) { Thread.Sleep(1000); Console.WriteLine(string.Format("Running Thread [{0}] ... {1} ", Task.CurrentId, i)); } Console.WriteLine(string.Format("Finish Thread [{0}]", Task.CurrentId)); }); t1.Wait(); t2.Wait(); t3.Wait(); } } }
1) # 유형 01
- 문법
Task "변수명" = new Task( "수행할 Action 델리게이트" , "Task에서 사용될 Object");
2) # 유형 2
- 문법
Task "변수명" = new Task.Factory.StartNew("수행할 Action 델리게이트" , "Task에서 사용될 Object");
"유형 01"과 다르게 선언과 동시에 인자로 부여한 Action<>을 수행합니다.
3) # 유형 3
- 문법
Task "변수명" = Task.Run(()=> { "작업 내용" } );
3. 출력결과
정의했던 Action 델리게이트 내용을 각 Task 변수들을 통해 병렬 수행한 결과입니다.
0 댓글