Task 클래스를 이용하여 비동기 처리

서병수·2023년 7월 12일
0

쓰레드와 테스크

목록 보기
2/5

23년 7월 12일

병렬 처리 : 하나의 작업을 여러 작업자가 나눠서 수행한 뒤 하나로 합치는 것
비동기 처리 : 작업의 결과를 기다리지 않고 다른 작업을 수행하다가 작업이 끝나면 그 결과를 받아내는 방식

테스크를 이용해서 비동기 처리를 할 수 있다. 다음 코드를 보며 내용을 파악해 보자

namespace TaskUsing
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string srcFile = "C:\\Users\\byeon\\OneDrive\\문서\\sadf.txt";

            Action<object> FileCopyAction = (object state) =>
            {
                string[] paths = (string[])state;
                File.Copy(paths[0], paths[1]);
                Console.WriteLine("TaskID : {0}, ThreadID : {1},{2} was copied to {3}", Task.CurrentId, Thread.CurrentThread.ManagedThreadId, paths[0], paths[1]);
            };

            Task t1 = new Task(FileCopyAction,new string[] { srcFile,srcFile+"copy1"});
            Task t2 = Task.Run(() =>
            {
                FileCopyAction(new string[] { srcFile, srcFile + "copy2" });
            });
            t1.Start();
            Task t3 = new Task(FileCopyAction, new string[] { srcFile, srcFile + "copy3" });
            t3.RunSynchronously();
            t1.Wait();
            t2.Wait();
            t3.Wait();
        }
    }
}
  1. File.Copy(paths[0], paths[1]);는 paths[0]이 paths[1]로 복사되는 메서드이다.

  2. Task.CurrentId : 현재 실행 중인 Task의 ID, Thread.CurrentThread.ManagedThreadId : 현재 실행 중인 스레드의 고유한 ID

  3. Action형 대리자 FileCopyAction은 state라는 변수를 입력받아 파일을 복사하는 메서드를 참조한다.

  4. Task t1 = new Task(FileCopyAction,new string[] { srcFile,srcFile+"copy1"});
    Task는 대리자와 대리자에 필요한 매개변수를 입력으로 받는다.

  5. 코드 요약 : 위의 코드는 Task클래스를 이용하여 파일을 복사하는 메서드이다. t1, t2는 비동기적으로 실행되어 t1.Wait(), t2.Wait()로 호출이 완료될 때까지 기다리게하는 메서드가 필요하지만 t3는 동기적으로 실행되어 메인메서드를 조종하던 스레드가 t3를 호출하여 메서드를 실행한다.

profile
안녕하십니까 인사올립니다

2개의 댓글

comment-user-thumbnail
2023년 7월 12일
  1. t1은 start 메소드를 호출했는데 왜 t2는 start 메소드를 호출안한건가요?

  2. t3는 왜 t3.wait을 호출한건가요?

1개의 답글