동기(Synchronous)란?
동기란 흔히 우리가 알고있는 절차지향방식이라고 생각하면 됩니다.
순서에 맞춰 이 코드가 실행되기 전까지에는 해당 코드가 실행되지 않습니다. 즉 순서가 정해져 있습니다.
장점은 순서가 직관적이고 정해져 있습니다.
단점은 순서가 정해져 있고 해당 순서가 오기전까지에는 다른 실행은 기달려야 합니다.
유니티는 기본적으로 동기 방식을 사용하고 있습니다.
비동기(Synchronous)란?
- 비동기란 동기의 반대로 절차지향이 아닌 해당 코드가 끝나지 않고도 다음 동작을 할 수 있습니다.
- 즉 순서를 보장해주지않고 요청한 작업이 완료 한 뒤에 순서를 직접 정해줘야 합니다.
- 하지만 다른작업이 오래걸리더라도 기다리지 않고 다른작업을 처리해주기 떄문에 굉장히 효율적 입니다.
Task 클래스
- 일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업을 수행한다
- 하나의 프로세스에서 둘 이상의 스레드가 동시에 작업을 수행하도록 하려면 멀티 스레드를 이용해야 한다
- Task 클래스는 .Net 4.0부터 도입된 클래스로 멀티 스레드에서 비동기 작업을 실행한다
- 태스크를 사용하는 방법은 직접 호출, Action 대리자 사용, 대리자, 람다식, 람다와 익명 메서드가 있다
Task 클래스 유의할점
- 일반적인 Task 클래스는 리턴값을 받지 못한다
- 리턴값을 받으려면 Generic 클래스를 사용해야 한다
- Result 속성를 통해 리턴값을 얻어올 수 있는데, 이 때 아직 스레드가 실행중이면 끝날 때까지 대기한다
위 경우는 Task에서 리턴값을 꼭 받아야 하는데
그 작업이 무거울 경우 /메인 스레드에서 다른 작업 실행/ 을 활용하여
메인 스레드에게 다른 일을 시키면 좋다고 한다.
Task 작업 취소하기
- CancellationToken 을 이용하여 Task를 취소할 수 있다.
Await, Async
- C# 5.0 부터 추가된 키워드 async과 await은 비동기 프로그래밍을 지원하는 키워드이다
- async는 해당 메서드가 await을 가지고 있음을 알려준다.
이에 유니티에서 코루틴을 제공해주기만 하지만 장점과 단점이 명확이 있다.
해당 글에 코루틴과 비동기에 대해서 단점과 장점을 잘 정리 했으니 읽어봐도 좋을거 같다.
https://gamedevbeginner.com/async-in-unity/#async_vs_coroutines
Async in Unity (better or worse than coroutines?) - Game Dev Beginner
Learn how to use async functions in Unity, how they're different from coroutines and if (and when) you should use them.
gamedevbeginner.com