TPL Task와 Async Task

마수리·2024년 2월 17일
0
post-thumbnail

안녕하세요 마수리입니다.
요즘 흥미롭게 보고있는게 Task 객체입니다. 보다보니 제가 몰랐던 사실이 많이 있더군요. 오늘 이야기할 주제는 아무것도 모르고 자연스럽게 사용하고있던 Task객체가 2개의 쓰임에 있다는 것에 대해서 이야기 해볼까합니다. 이 이야기의 시작은 첫 번째 Task 객체의 등장에서부터 시작해야 할 것 같습니다!

Task의 첫 등장

C# 4.0에 등장한 Task는 TPL이란 이름 달고 나와 대표적으로 Task.Factory.StartNew() 함수를 제공 하는 등 프로그래머가 조금 더 편하게 비동기 작업을 할 수 있도록 도움을 주었습니다.

이후 등장한 다른 Task

C# 5.0에 등장한 다른 Taskasync/await를 붙일 수 있는 Task입니다. 여기서 말하는 Task는 TPL과 다르게 코드 혹은 이벤트가 종료 되는 것을 기다리는 것에 초점이 맞아 있습니다. 참고로 C# .NET 개발 팀은 다른 언어에서 처럼 "Future""Promise" 형태의 새로운 객체를 만들어서 개발하려 했으나 기존에 있던 Task 객체에서 일부기능이 개발되어있어 기존에 있던 Task 객체에 기능을 확장해서 async/await 기능을 제공하기로 하였습니다.

TPL Task와 Async Task의 차이

  1. TPL의 Task는 Task의 생성과 스케쥴(실행) 작업이 분리되어있지만 Async Task는 항상 실행되고 있는 Task입니다. 예를 들어 TPL Task를 생성하고 Start 함수는 최종적으로 호출 할 수 있지만 await를 하는 부분은 Task를 Start한 부분이여야 한다는 것을 예로 들 수 있습니다.

  1. TPL의 Task는 각각의 Task에서 예외가 발생 될 수 있어 단 1개의 예외가 있더라도 무조건 AggregateException으로 예외를 반환하게 되어있습니다. 하지만 Async Task는 일반적으로 작성하는 동기 코드와 같이 언제나 단 1개의 에러를 가지도록 디자인 되어있기 때문에 ExceptionAggregateException으로 감싸서 던지지 않는다는 차이가 있습니다.

  2. TPL의 Task는 예외를 밖으로 던지지 않지만 Async Task의 예외는 일반적으로 작성하는 동기코드와 같이 예외를 밖에서 catch할 수 있습니다. [관련 된 질의 응답 링크] (어떻게 해서 이렇게 동작하는지는 잘 모르겠네요. 누군가 알면 알려주세요.. ㅠ)

이정도 내용만 한번정도 읽어두면 앞으로 코드를 작성할 때 Task 객체가 2개의 타입으로 보이는 신비함을 체험하실 수 있으실 겁니다! 😀
Async Task도 코드기반, 이벤트기반 등의 이름으로 2개의 Async Task로 분리되는데 이 내용에 대해서는 시간이되면 글을 써보도록 하겠습니다!

감사합니다!

profile
.NET 개발자 마수리입니다 🖐

0개의 댓글