[C#] Task

JanMatny·2024년 10월 24일
0

C#

목록 보기
5/15

Task

  • Task 클래스 : 스레드, 스레드풀의 단점을 개선한 클래스 [ C# 4.0 ]
  • Task를 사용하기 위해선 using System.Threading.Tasks;를 선언해야 한다.

    내부적으로는 Task 클래스도 ThreadPool(스레드풀)을 이용하는 것이기 때메
    별 차이가 없다.

Task 메서드

  • task.Start() : Task 작업을 실행한다.
  • Run() : Task의 생성과 시작을 한번에 하는 메서드 [ 일반적으론 Start보다 많이 쓰인다. ]
  • Wait() : Task가 완료될 때까지 현재 스레드 대기
    • Tread.Join 메서드와 비슷한 기능을 한다.
  • ContinueWith() : Task가 완료된 후 실행할 작업(Task) 지정
  • WhenAll() : 매개변수 Task가 모두 완료될 때까지 대기 모든 Task가 완료되면 새로운 Task 반환
  • WhenAny() : 매개변수 Task 중 먼저 완료된 Task 반환
  • Task.Factory.StartNew() : Run() 메서드보다 좀 더 많은 옵션을 선택할 수 있다.
  • Task.Delay() : 지정된 시간만큼 대기하는 비동기 작업을 생성한다. 이를 통해 타이밍 제어나 주기적인 작업을 간편하게 구현할 수 있다.

Start() 메서드 및 ContinueWith() 메서드를 활용한 Task 코드

Run() 메서드 및 WhenAll() 메서드를 활용한 Task 코드


Task의 활용성

  1. 비동기 처리 : UI 어플리케이션에서 긴 작업을 비동기적으로 처리하여 사용자 인터페이스의 응답성을 유지할 수 있다.
  2. 병렬 작업 : 여러 작업을 동시에 실행하여 CPU 자원을 효율적으로 활용할 수 있다.
    • EX) 데이터 처리, 파일 I/O 등을 병렬로 수행할 수 있다.
  3. 간편한 예외처리 : Task는 비동기 작업에서 발생할 수 있는 예외를 쉽게 처리할 수 있는 구조를 제공한다. TaskException 속성을 통해 예외정보를 손쉽게 확인할 수 있다.
  4. 연결성 : Task는 다른 비동기 작업과 쉽게 연결할 수 있다. ContinueWith 메서드를 사용하여 이전 작업이 완료된 후 실행할 작업을 지정할 수 있다.
  5. 스케쥴링 : Task는 스레드 풀을 사용하여 효율적으로 작업을 스케쥴링하므로, 스레드 관리를 수동으로 하지 않아도 된다.

Task의 장점

  • 응답성 향상 : 비동기 작업을 통해 사용자 인터페이스가 멈추지 않도록 할 수 있다.
  • 자원 효율성 : 스레드 풀을 통해 필요한 만큼의 스레드만 사용하여 자원 소비를 최소화 한다.
  • 코드 가독성 : 비동기 프로그래밍 패턴을 통해 코드가 더 명확해질 수 있다.
  • 유연성 : Task를 통해 다양한 비동기 패턴을 쉽게 구현할 수 있어, 복잡한 비즈니스 로직을 더 직관적으로 작성할 수 있다.
  • 상태 비저빌리티 : 각 Task의 진행 상태를 쉽게 추적할 수 있어, 어플리케이션의 동작을 모니터링하기가 용이하다.

Task의 단점

  • 복잡성 증가 : 비동기 코드 작성이 복잡할 수 있으며, 특히 여러 개의 Task가 서로 연결되거나 의존할 때 가독성이 떨어질 수 있다.
  • 디버깅 문제 : 비동기 코드의 디버깅은 동기 코드보다 더 어려울 수 있다. 예외가 발생하면 어디에서 문제가 발생하는지 추적하기 힘들 수 있다.
  • 상태 관리 : 비동기 작업의 상태를 관리하는 것이 필요할 수 있으며, 특히 공유 자원을 다룰 때 주의해야한다.
  • 리소스 누수 : 적절한 관리 없이 Task를 사용하면 리소스 누수가 발생할 수 있으며, 특히
    [!] 비동기 작업이 완료되기 전에 프로그램이 종료되는 경우 주의해야한다.
  • 컨텍스트 문제 : 비동기 코드에서 특정 컨텍스트(EX: UI 스레드)를 유지해야하는 경우, 컨텍스트 손실로 인해 문제가 발생할 수 있다.

활용 예제

  1. 비동기 웹 요청 : 비동기적으로 HTTP 요청을 보내고 응답을 받을 때 Task를 사용하여 UI가 차단되지 않도록 할 수 있다.
  2. 병렬 데이터 처리 : 데이터베이스 쿼리나 파일 처리 작업을 병렬로 실행하여 성능을 향상시킬 수 있다.
profile
코딩 공부용 벨로그

0개의 댓글