Microsoft MVP성태의 닷넷 이야기
ValueTask를 multiple await 하지 말라는데 [링크 복사], [링크+제목 복사],
조회: 663
글쓴 사람
eric (gss9282 at gmail.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)

https://devblogs.microsoft.com/dotnet/understanding-the-whys-whats-and-whens-of-valuetask/

이 게시글이나 msdn 보면 ValueTask에 대해서 multiple await가 안좋다 하는데


제가 다음과 같이

var t = GetValue();
await t;
await t;

private async ValueTask<int> GetValue()
{
    if (cachedValue is null)
    {
        await Task.Delay(500);
        cachedValue = 5;
    }
    return cachedValue.Value;
}

이러면 CA2012 경고가 나오긴 하는데
작동은 잘됩니다.

어떠한 케이스에서 multiple await를 쓰면 예외가 터지는건가요?


[연관 글]






[최초 등록일: ]
[최종 수정일: 6/10/2025]


비밀번호

댓글 작성자
 



2025-06-11 04시00분
해당 글을 잠시 읽어보니까, 그 글에 답이 잘 나오는군요. ^^

multiple await을 할 때 예외가 발생할 수 있는 경우는 ValueTask가 IValueTaskSource를 구현한 개체를 감싸서 반환한 경우입니다. 예제로 든 경우는 TResult를 반환한 값이기 때문에 경고는 나와도 문제는 없습니다.

참고로, IValueTaskSource를 구현한 개체를 반환하더라도 문제가 안 되는 경우도 있습니다. 문제가 되는 경우는, 해당 문서에서도 예를 들어 나오지만 Pool에 관리가 된 경우입니다. 가령 예제에서 GetValue가 풀링된 개체를 담은 ValueTask를 반환했다고 가정하면 두 번째 await 호출 시에 이미 해당 개체는 풀에 반환돼 다른 값을 가지고 있거나 반환되면서 값이 초기화돼 정상적인 값을 구할 수 없게 될 것입니다.

게다가, IValueTaskSource를 감싼 경우라면 await을 분리해서 호출하는 경우에도 문제가 발생할 수 있습니다. 즉, 다음과 같이 직접 호출하는 식으로 바꿔야 합니다.

var t = await GetValue(); // 이렇게 메서드 호출에 직접 await 사용

왜냐하면, IValueTaskSource가 반환하면서 직접적인 값을 ValueTask<TResult>의 TResult를 '값 복사'해서 반환해 사용해야 안전한 것입니다. 그렇지 않고 ValueTask<TResult>로 받고 이후에 await을 하게 되면 위에서 설명했던 것과 마찬가지로 풀링에 이미 반환돼 다른 목적으로 사용될 수 있으므로 오동작을 할 수 있는 것입니다.

-----------------

아래의 글에 정리했으니 참고하세요.

C# - IValueTaskSource로 인해 주의가 필요한 ValueTask 호출
; https://www.sysnet.pe.kr/2/0/13952
정성태

... 76  77  78  79  80  81  82  83  84  85  [86]  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
326권인성2/23/200611213    답변글 [답변]: 한가지만 더 질문할게요.... [1]
323정보문2/21/200611579메일 내용에서 한글이 깨집니다. [1]파일 다운로드1
321셈토2/18/200611362SPOOL --> EMF --> TEXTOUT [1]
320정보문2/18/200611160파일의 최대 크기2 [1]
318정보문2/18/200612327파일의 최대 크기
319정성태2/18/200612392    답변글 [답변]: 파일의 최대 크기 [1]
317narc...2/17/200611495[IE embeded SmartClient]에서 닷넷 리모팅 프록시 사용시 처음 2분간 딜레이현상이 발생합니다. [1]
322narc...2/20/200612349    답변글 [답변]: 다시한번 부탁드리겠습니다..
316이경찬2/15/200613781MSDN 매거진 정기구독 신청은 어디서 할수있나요? [1]
315정준명2/15/200617192[DxFramework Lite] 분산 트랜잭션에 참여하는 동안 오류가 발생했습니다. [2]
314이윤희2/14/200611415엑셀변환시....그림을 넣을려면. [1]
313장강현2/14/200611586SmartClient 디버그 문제 [1]
312정보문2/13/200611593방법2006 [1]
309정보문2/10/200612756edit & continue [3]
308김용국2/11/200611190스마트클라이언트 관련질문 [ Client 에서 WebPage의 JavaScript 호출방법이 있을까요? 있다고는 한것 같은데..부탁드림^^
310정성태2/11/200610705    답변글 [답변]: 스마트클라이언트 관련질문 [ Client 에서 WebPage의 JavaScript 호출방법이 있을까요? 있다고는 한것 같은데..부탁드림^^
307narc...2/10/200612467IE Embeded 스마트클라이언트는 UserControl만 가능한가요? [2]
305정보문2/10/200612570웹 컨트롤
306정성태2/10/200612112    답변글 [답변]: 웹 컨트롤
303정보문2/10/200613104회원가입성공을 기념으로 질문 한 가지 던집니다.
304정성태2/10/200611505    답변글 [답변]: 회원가입성공을 기념으로 질문 한 가지 던집니다.
302김성2/7/200612686C#이나 VB.NET 으로 만든 것을 SETUP 해서 배포하려고 하는데요.. [1]
301참깨2/3/200616960개체가 이 속성 또는 메소드를 지원하지 않습니다. [1]
300김종욱2/2/200611321안녕하세요 [2]
299꼬부기1/19/200610448스마트클라이언트 관련 질문입니다... [2]
298정말초짜1/12/200610717smart client 질문입니다. [1]
... 76  77  78  79  80  81  82  83  84  85  [86]  87  88  89  90  ...