• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

Task.Delay에 관하여 질문있습니다

21.06.19 18:08 작성 조회수 558

2

안녕하세요 강의를 듣던 중 궁금한 점이 생겨 질문드리게되었습니다.

async가 유니티의 코루틴과 비슷하게 싱글쓰레드로 동작한다면

질문1) 강의에서 

await Task.Delay(3000);

와 같은 Task는 하나의 쓰레드가 다른 함수들 사이를 왔다 갔다 하면서 시간 측정을 하게 되나요?(다른 함수가 무한 루프가 아닌경우)

ex)

1. Task.Delay 시작 (await를 만나 Main으로 빠져나옴)

2. Main 함수 이어서 시작 (Main은 async가 아님)

3. Task.Delay 시간 측정

4. Main 함수 이어서 시작

5. Task.Delay 시간 측정

6. Main 함수 이어서 시작

...(Delay에서 정해진 시간이 될 때까지 반복)

질문2) 위와 같은 경우 Main함수 내부의 실행이 오래 걸려(무한 루프는 아님) 제어권을 늦게 넘겨주게 되어 Delay에서 설정한 시간보다 더 오래 기다리는 경우가 발생할 수 있나요? 

읽어주셔서 감사합니다.

답변 1

답변을 작성해보세요.

4

일단 함수를 반환하고, 중앙에서(프레임워크 차원에서) 관리한 다음
때가 되면 이어서 나머지 부분을 실행하는 부분이
Unity의 Coroutine과 의미하다는 말이지만
그렇다고 로직이 유니티처럼 100% 단일 쓰레드에서 실행된다는 의미는 아닙니다.

질문 내용을 보니 Main 함수에서 실행되고 있던 흐름을
Task.Delay가 가로채서 실행되는 것인지? 를 질문하시는거 같은데,
실행하고 있던 것을 가로채서 뭔가 주기적으로 왔다 갔다 하는 개념은 아닙니다.

실제로 Task.Delay를 별도의 async 함수에서 await로 던져놓고 Main은 무한루프를 돈다면,
Task.Delay가 마친 다음의 코드가 다른 쓰레드에서 실행됨을 확인할 수 있습니다.
따라서 managed thread 차원에서 (중앙에서) 관리한다고 생각하는 것이 타당합니다.
세부적인 구현은 물론 저도 딱히 알지 못하고
그런 부분까지 궁금하시다면 구글링을 해보거나 MSDN을 찾아봐야겠지만
안 나올 확률이 매우 높습니다.
async/await는 이해하기 난해한 부분이 많아서
직접 이런 저런 케이스에 대해 테스트를 해보면서 학습하는게 수월합니다.