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)