[C#] Thread와 Task - ysp-laonpeople/DOC GitHub Wiki

Thread와 Task의 차이

  • C#에서 Task는 Thread와 동일하게 비동기 작업을 처리하기 위해 사용합니다.
  • Thread는 Main Thread와 완전 독립적으로 동작하기 때문에 프로세스가 종료되는 시점에도 주어진 작업을 계속 하게 됩니다.
  • ThreadPool을 생성하고 이를 관리하여 이용하는 방법이 있지만 Task는 이를 자동으로 처리해주기 때문에 간편하게 사용할 수 있습니다.

TestCode

  • MainThread에서 DoWork를 실행하고 사용자가 키를 입력하면 종료되는 프로그램입니다.
        static void Main(string[] args)
        {
            //Thread
            //Thread t1 = new Thread(DoWork);
            //t1.Start();

            //Task
            //Task t2 = new Task(DoWork, null);
            //t2.Start();

            //ThreadPool            
            //ThreadPool.QueueUserWorkItem(DoWork, null);

            Console.ReadLine();
        }
        static void DoWork(object obj)
        {
            while (true);  
        }

Thread

  • 키를 입력했지만 프로그램이 종료되지 않고 DoWork가 종료될때까지 대기합니다.
        static void Main(string[] args)
        {
            //Thread
            Thread t1 = new Thread(DoWork);
            t1.Start();

            Console.ReadLine();
        }

image

ThreadPool

  • 키를 입력하면 DoWork와 함께 프로그램이 종료됩니다
        static void Main(string[] args)
        {
            //ThreadPool            
            ThreadPool.QueueUserWorkItem(DoWork, null);

            Console.ReadLine();
        }

Task

  • 키를 입력하면 DoWork와 함께 프로그램이 종료됩니다.
        static void Main(string[] args)
        {
            //Task
            Task t2 = new Task(DoWork, null);
            t2.Start();

            Console.ReadLine();
        }

내가 Task를 사용하는 이유

  • 비동기 작업이 종료된 이후에 처리해야 하는 작업을 연속적으로 처리하기에 편리하기 때문입니다.
  • 프로그램 종료 시 자동으로 관리되는 ThreadPool을 종료하므로 정상 종료가 보장됩니다.
        static void Main(string[] args)
        {
            Task.Run(() =>
            {
                for (int i = 0; i < 5000; i++) 
                    Thread.Sleep(1);
                Console.WriteLine("End");
            })
                .ContinueWith((t) => { Console.WriteLine("continue 1"); })
                .ContinueWith((t) => { Console.WriteLine("continue 2"); });

            Console.WriteLine("wait key");
            Console.ReadLine();
        }

image