Search
Duplicate

UniTask의 함정

작성일
2022/12/19 06:20
분류
Unity
async UniTask Foo(UniTask task) { Log("1"); await task; Log("3"); } async UniTask Bar() { Log("2"); await UniTask.CompletedTask; } void main() { Foo(Bar()).Forget(); }
C#
복사
이 코드는 어떻게 작동할까?
아마도 1, 2, 3 처럼 작동되리라 기대할 것이다
하지막 실제로 코드를 실행해보면 2, 1, 3 순서대로 호출된다
UniTask는 Action 과 다르게 인자로 넘기는 순간 async 특성상 UniTask 메서드가 실행되어 버리기 때문이다
의도처럼 1, 2, 3 대로 실행을 하기 위해서는, 메서드의 인자로 Action 을 받거나,
Foo(Bar) 처럼 그냥 넘겨주는 대신 Foo(UniTask.Defer(Bar)) 와 같이 await 를 만날때 실제로 평가되는 Defer 기능을 사용해야 한다

Changelog

main 메서드 내 오타가 있어 수정했습니다 (2023.06.12 17:31)