안녕하세요 마수리입니다.
요즘 흥미롭게 보고있는게 Task 객체입니다. 보다보니 제가 몰랐던 사실이 많이 있더군요. 오늘 이야기할 주제는 아무것도 모르고 자연스럽게 사용하고있던 Task객체가 2개의 쓰임에 있다는 것에 대해서 이야기 해볼까합니다. 이 이야기의 시작은 첫 번째 Task 객체의 등장에서부터 시작해야 할 것 같습니다!
C# 4.0에 등장한 Task
는 TPL이란 이름 달고 나와 대표적으로 Task.Factory.StartNew()
함수를 제공 하는 등 프로그래머가 조금 더 편하게 비동기 작업을 할 수 있도록 도움을 주었습니다.
C# 5.0에 등장한 다른 Task
는 async
/await
를 붙일 수 있는 Task
입니다. 여기서 말하는 Task
는 TPL과 다르게 코드 혹은 이벤트가 종료 되는 것을 기다리는 것에 초점이 맞아 있습니다. 참고로 C# .NET 개발 팀은 다른 언어에서 처럼 "Future"나 "Promise" 형태의 새로운 객체를 만들어서 개발하려 했으나 기존에 있던 Task
객체에서 일부기능이 개발되어있어 기존에 있던 Task
객체에 기능을 확장해서 async
/await
기능을 제공하기로 하였습니다.
Task
입니다. 예를 들어 TPL Task를 생성하고 Start 함수는 최종적으로 호출 할 수 있지만 await
를 하는 부분은 Task
를 Start한 부분이여야 한다는 것을 예로 들 수 있습니다.TPL의 Task
는 각각의 Task
에서 예외가 발생 될 수 있어 단 1개의 예외가 있더라도 무조건 AggregateException
으로 예외를 반환하게 되어있습니다. 하지만 Async Task는 일반적으로 작성하는 동기 코드와 같이 언제나 단 1개의 에러를 가지도록 디자인 되어있기 때문에 Exception
을 AggregateException
으로 감싸서 던지지 않는다는 차이가 있습니다.
TPL의 Task
는 예외를 밖으로 던지지 않지만 Async Task의 예외는 일반적으로 작성하는 동기코드와 같이 예외를 밖에서 catch
할 수 있습니다. [관련 된 질의 응답 링크] (어떻게 해서 이렇게 동작하는지는 잘 모르겠네요. 누군가 알면 알려주세요.. ㅠ)
이정도 내용만 한번정도 읽어두면 앞으로 코드를 작성할 때 Task 객체가 2개의 타입으로 보이는 신비함을 체험하실 수 있으실 겁니다! 😀
Async Task도 코드기반, 이벤트기반 등의 이름으로 2개의 Async Task로 분리되는데 이 내용에 대해서는 시간이되면 글을 써보도록 하겠습니다!
감사합니다!