📒 갈무리 - Task
📌 동기 코드와 비동기 코드
동기 코드 : 메서드를 호출한 뒤에 이 메서드의 실행이 완전히 종료되어야 다음 메서드를 호출할 수 있습니다.
비동기 코드 : 메서드를 호출한 뒤에 메서드의 종료를 기다리지 않고 바로 다음 코드를 실행합니다.
📌 오버헤드란?
- 프로그램의 실행흐름에서 나타나는 현상중 하나로 예를 들어, 프로그램의 실행흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때, 추가적인 시간, 메모리, 자원이 사용되는 현상
📌 스레드 풀이란?
- 스레드를 지속적으로 생성하고 삭제하면 오버헤드가 발생하는데, 이것을 해결하기 위해 스레드 풀을 사용한다.
- 프로세스에 스레드 풀을 생성하고 스레드 작업이 필요한 경우 풀에서 스레드를 꺼내와 사용하고 작업이 끝나면 해제하는 것이 아니라 스레드 풀에 되돌려 주는 방식으로 성능의 향상을 꾀한다.
📌 Task란?
- 스레드 사용으로 인한 오버헤드를 예방하기 위해 스레드 풀을 사용했지만, C# 스레드 풀의 제약 사항으로인해 작업이 완료 되기도 전에 프로세스가 종료 될 수 있다는 단점이 있었다. 이 단점을 커버하기 위해 Task를 사용한다.
- 기본적으로 백그라운드 속성의 스레드이다.
📌 Task의 장점
- 스레드를 최소한으로 생성한다.(Thread pool)
- 작업 완료 시점을 알 수 있다.(Task Chain)
- 결과값을 리턴받을 수 있다.
- 취소 / 예외처리를 할 수 있다.
📌 Task 예제
static void Main(string[] args)
{
TaskEX();
}
public static void TaskEX()
{
Task task1 = new Task(num => Console.WriteLine("task action1 : " + num), 1);
task1.Start();
task1.Wait();
Task<int> task2 = new Task<int>(num =>
{
Console.WriteLine("task action2 : " + num);
return (int)num;
}, 2);
task2.Start();
task2.Wait();
Console.WriteLine("task result " + task2.Result);
}
📌 async
- await 키워드를 사용할 수 있게 만들어준다.
- async 메소드의 반환 값을 일반적인 메소드와 다른 방식으로 다루도록 변경한다.
- 반드시 void or Task or Task<T>를 반환해야 한다.
- void를 반환하게 되면 비동기 메서드를 호출하는 쪽에서 비동기 제어를 할 수 없다.
📌 await
- 피연산자가 나타내는 비동기 작업이 완료될 때까지 수행을 중지한다.
- await연산자를 포함한 메소드에 async를 붙여 컴파일러가 해당 함수가 비동기 함수임을 알 수 있게 한다.