Microsoft MVP성태의 닷넷 이야기
C# 비동기 함수 async, await 와 Task의 관계에 대해 질문 드립니다. [링크 복사], [링크+제목 복사]
조회: 7015
글쓴 사람
종범 (kjb_jh at naver.com)
홈페이지
첨부 파일
 

비동기 함수와 Task의 관계에 대해 궁금한 점이 생겨서 질문 드립니다.

async()와 await()는 C#뿐 아니라 C++에도 있는 함수입니다.
C++에서 async()와 await()는 Thread Pool에서 돌아간다고 알고 있습니다. 때문에 C#의 Task와 비슷하다고 생각했습니다.
그런데 C#에는 async()와 await()가 있음과 동시에 Task도 있습니다.

C#에서 async(), await()와 Task가 서로 다른 것인지 궁금합니다.



비동기 함수와 Task는 동작방식은 비슷하지만 전혀 다른 것인지,
Task 위에서 돌아가도록 하는 키워드같은 것인지 궁금합니다.








[최초 등록일: ]
[최종 수정일: 4/27/2021]


비밀번호

댓글 작성자
 



2021-04-27 04시59분
엄밀히 말해서 Task는 async/await과 독립적인 구성 요소입니다. 기존에는 닷넷의 ThreadPool을 제어할 수 있는 방법이 매우 한정적이었는데, 이러한 제약을 극복한 것이 Task입니다.

그리고, async/await이 어차피 비동기 호출이 완료된 후, 그 완료 이벤트를 받았을 때 계속 코드를 실행해야 하는 작업을 스레드 풀의 스레드가 담당하게 되는데 자연스럽게 Task로 그 작업을 맡기게 된 것입니다. 사실, Task가 없었어도 어떻게든 async/await을 구현했을 것입니다. 대신 Task가 제공하는 것만큼 구조적으로 세밀한 제어를 하진 못했을 것입니다. (아마도 async/await을 만들면서 요구 사항들이 Task의 구현에도 많이 반영되었을 것입니다.)

어쨌든, async/await을 전혀 쓰지 않아도 Task는 그 자체로 좋은 스레드풀 제어 클래스입니다.
정성태
2021-04-28 09시41분
[종범] 엄밀히 다른 아이들이군요!
1. 닷넷에서 ThreadPool에 대한 제어를 보다 쉽게 하기 위해 Task를 만들었다.
2. async/await보다 자세한 제어를 하려면 Task를 사용하는 것이 좋다.
3. 둘 다 ThreadPool을 사용하는 것이므로 속도차이는 무시할 정도로 미미하거나 없다고 생각된다.
4. 어떤 것을 사용할 것인지는 개발자 취향인 듯 하다.
이렇게 정리가 되었습니다.
혹시 틀린 정리가 있을 까요???
[guest]
2021-04-28 10시23분
대충 그렇게 생각하시면 되겠습니다. 다음의 글도 참고하시면 도움이 될 것입니다.

C# 컴파일러 대신 직접 구현하는 비동기(async/await) 코드
; https://www.sysnet.pe.kr/2/0/11351
정성태
2021-04-29 09시26분
[종범] 감사합니다!!!
[guest]
2021-05-06 10시18분
[이성환] 여기에 약간의 사족을 붙여봅니다.
기존 비동기 지원 방식 자체가 Delegate의 BeginInvoke 를 이용해 스레드 풀을 이용하는 것만 지원하고 있었기 때문에 비동기 작업 이후의 처리에 제약이 많았습니다.
(AsyncOperation 을 사용하는 EAP는 제외)

그래서 Task 가 추가되면서 SynchronizationContext 이용한 비동기 처리를 지원하기 시작한 것이고
SynchronizationContext 을 이용한 다양한 제어가 가능해졌습니다.
Task의 Start 메서드는 결국 최종적으로 SynchronizationContext 의 Post 메서드를 호출하여 비동기 작업을 수행합니다.
(SynchronizationContext 자체는 .Net 2.0부터 지원되기 시작했습니다.)

하지면 Task 사용 시 별도의 SynchronizationContext 설정이 없다면
기본으로 스레드 풀을 사용하는 default SynchronizationContext를 이용하도록 되어 있기 때문에
거의 대부분의 경우에서는 Task 는 스레드 풀을 이용한다고 생각하면 큰 문제가 없을 듯 합니다.

그리고 결국 async / await 역시 Task 의 기능을 사용하는 것이므로 결과적으로는 SynchronizationContext를 이용해 비동기 처리와 콜백 처리를 하게 됩니다.

이런 내용은 성태님 게시물에 자세히 설명되어 있는데 댓글 지면의 한계 때문에 여기서는 더 언급하지 않으신 거 같아
주제넘게 제가 사족을 달아봤습니다. ~ㅁ~
[guest]
2021-05-07 09시09분
[종범] 감사합니다~!~!!!
[guest]

... 16  17  [18]  19  20  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5485이재원4/17/20216286교재 315페이지 내용 질문 [3]
5484Syong4/16/20219843윈폼 기반의 응용프로그램 dll 참조와 32,64bit 빌드 관련 문의 [4]
5483한예지 donator4/15/20215327익명 형식과 var 관계 질문 있습니다. [2]
5482질문4/13/20217123WPF를 위한 MVVM toolkit 선택과 관련한 문의드립니다. [4]
5480한예지 donator4/5/20217434GetHashCode 질문있습니다! [2]
5479한예지 donator4/4/20216502Equals를 닷넷에서 어떻게 구현했는지 보고 싶을 떄는 어떻게 해야 될까요? [2]
5478갑자기C#3/23/20218959C# Winform에서 TextBox없이 입력 받을 수 있나요? [7]
5477달팽이3/18/20215961c# 도형을 그린후 편집하는 방법이 궁금합니다. [2]파일 다운로드1
5475dimo...3/2/20216974POH가 .NET 5에 추가된 것으로 알고 있습니다. POH가 유용한 경우는 어떤 경우가 있을까요? [1]
5474Syong2/26/20216518사용자 지정 컨트롤 생성시 Invalidate, Update, Refresh의 차이점 [2]
5473한예지 donator2/25/20216387디자인 타임이 뭔지 궁금합니다!! [5]
5472dimo...2/24/20217171등록하지 않고 ocx를 사용하는 `키움`관련 포스팅을 따라가다 질문드립니다. [9]
5471남산2/21/20215808MarshalDirectiveException 에 대한 질문입니다. [1]
5470한예지 donator2/7/20215740yield 질문있습니다!! [2]
5469유호성2/6/20215297Parallel + Task.Run 동시 실행 환경에서 간헐적으로 Task.Run()에서 null이 리턴됩니다. [3]파일 다운로드1
5467hero...2/4/20215691실행 환경에 따른 Thread.Sleep 딜레이 차이 질문 [8]
5466pr1/29/20215552c# winform load시 작업표시줄에 뜨지 않는 현상을 겪으신적이 있으신가요? [4]파일 다운로드1
5465영귤1/28/20215923두 번째 await 부터는 스레드 개수만 늘어나는 것이 아닌가요 [1]
5464민우1/26/20216196C# 빌드시 코드 치환되는걸 확인하는 방법 문의 [2]
5463한예지 donator1/24/20216935Parameters.AddWithValue 와 Parameters.Add 의 차이점이 궁금합니다. [2]
5462C#초보1/22/20217339사용자 정의 메시지 전달이 가능한가요? [2]
5461한예지 donator1/22/20216724AsEnumerable() 메서드 질문 있습니다! [2]
5459한예지 donator1/21/20216075typeof와 GetType의 차이점 질문있습니다. [2]
5458진우1/20/20216958C# DataTable 에 SQL 쿼리문을 실행하는 방법 문의 (LINQ 사용하지 않고) [6]
5456성민1/17/202173629.0 출간 계획이 있으신가요? [2]
5455한예지 donator1/16/20216385교재 194페이지 콜백메서드 질문 있습니다! [5]
... 16  17  [18]  19  20  21  22  23  24  25  26  27  28  29  30  ...