[C#] 비동기 작업 Task 사용법과 예제



이번 포스팅에서는 비동기식으로 동작하는 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 댓글