C# - Task) 복습을 위해 작성하는 글 2023-04-24

rizz·2023년 4월 24일
0

C

목록 보기
11/25

📒 갈무리 - Task

📌 동기 코드와 비동기 코드

동기 코드 : 메서드를 호출한 뒤에 이 메서드의 실행이 완전히 종료되어야 다음 메서드를 호출할 수 있습니다.

비동기 코드 : 메서드를 호출한 뒤에 메서드의 종료를 기다리지 않고 바로 다음 코드를 실행합니다.

 

📌 오버헤드란?

- 프로그램의 실행흐름에서 나타나는 현상중 하나로 예를 들어, 프로그램의 실행흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때, 추가적인 시간, 메모리, 자원이 사용되는 현상

 

📌 스레드 풀이란?

- 스레드를 지속적으로 생성하고 삭제하면 오버헤드가 발생하는데, 이것을 해결하기 위해 스레드 풀을 사용한다.

- 프로세스에 스레드 풀을 생성하고 스레드 작업이 필요한 경우 풀에서 스레드를 꺼내와 사용하고 작업이 끝나면 해제하는 것이 아니라 스레드 풀에 되돌려 주는 방식으로 성능의 향상을 꾀한다.

 

📌 Task란?

- 스레드 사용으로 인한 오버헤드를 예방하기 위해 스레드 풀을 사용했지만, C# 스레드 풀의 제약 사항으로인해 작업이 완료 되기도 전에 프로세스가 종료 될 수 있다는 단점이 있었다. 이 단점을 커버하기 위해 Task를 사용한다.

- 기본적으로 백그라운드 속성의 스레드이다.

📌 Task의 장점

- 스레드를 최소한으로 생성한다.(Thread pool)

- 작업 완료 시점을 알 수 있다.(Task Chain)

- 결과값을 리턴받을 수 있다.

- 취소 / 예외처리를 할 수 있다.

📌 Task 예제

        // 자주 사용되는 Task 버전
        /*      // Action을 인자로 받는 버전
                public Task(Action action);

                // 인자기 있는 Action
                public Task(Action<object?> action, object? state);

                // Func<T>를 인자로 사용하는 제네릭 버전
                public Task(Func<TResult> function);

                // 인자가 있는 Func
                public Task(Func<object?, TResult> function, object? state);*/
        static void Main(string[] args)
        {
            TaskEX();
        }
        public static void TaskEX()
        {
            // num을 인자로 받고 리턴값이 없는 Task
            Task task1 = new Task(num => Console.WriteLine("task action1 : " + num), 1);
            task1.Start();

            // task가 끝날 때까지 스레드 대기
            task1.Wait();

            // num을 인자로 받고 int를 return하는 Task
            Task<int> task2 = new Task<int>(num =>
            {
                Console.WriteLine("task action2 : " + num);
                return (int)num;
            }, 2);

            task2.Start();
            task2.Wait();

            // task가 끝날 때까지 대기하다가 끝나면 결과값을 출력
            Console.WriteLine("task result " + task2.Result);
        }

 

📌 async

- await 키워드를 사용할 수 있게 만들어준다.

- async 메소드의 반환 값을 일반적인 메소드와 다른 방식으로 다루도록 변경한다.

- 반드시 void or Task or Task<T>를 반환해야 한다.

- void를 반환하게 되면 비동기 메서드를 호출하는 쪽에서 비동기 제어를 할 수 없다.

📌 await

- 피연산자가 나타내는 비동기 작업이 완료될 때까지 수행을 중지한다.

- await연산자를 포함한 메소드에 async를 붙여 컴파일러가 해당 함수가 비동기 함수임을 알 수 있게 한다.

profile
복습하기 위해 쓰는 글

0개의 댓글