[TIL] 비동기 프로그래밍(C Sharp)
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!
그동안 Unity에서 비동기 메서드를 코루틴으로 구현했지만, UniTask 라이브러리를 통해 다른 방식으로 비동기 메서드를 작성해보고자 한다
Unity 엔진은 메인 스레드에서 게임 로직을 실행한다
Unity의 거의 모든 API는 메인 스레드에서만 호출 가능
// ✅ 메인 스레드에서 실행 - 정상 동작
void Update()
{
transform.position = Vector3.zero;
GameObject obj = Instantiate(prefab);
Debug.Log("Hello");
}
// ❌ 다른 스레드에서 실행 - 예외 발생
void SomeBackgroundThread()
{
transform.position = Vector3.zero; // 예외!
GameObject obj = Instantiate(prefab); // 예외!
}
무거운 작업은 별도의 스레드에서 실행해야 메인 스레드가 멈추지 않는다
주의: 백그라운드 스레드에서 Unity API를 사용할 수 없다(Transform, Rigidbody 등)
목표: 코루틴으로 처리하던 코드들을 C# 표준 비동기(async, await, Task)로 작성하기
| 구분 | 코루틴 | async/await |
|---|---|---|
| 실행 주체 | Unity 엔진 | .NET 런타임 |
| 반환 타입 | IEnumerator | Task, Task |
| 재개 시점 제어 | yield return | await |
| 예외 처리 | 어려움 | try-catch 사용 가능 |
| 취소 | StopCoroutine | CancellationToken |
IEnumerator MyCoroutine()
{
transform.position = Vector3.zero; // ✅ 가능
yield return new WaitForSeconds(1);
transform.position = Vector3.one; // ✅ 가능 (항상 메인 스레드)
}
코루틴의 핵심: Unity가 매 프레임 메인 스레드에서 MoveNext() 호출 → 항상 Unity API 사용 가능
async Task MyAsyncMethod()
{
transform.position = Vector3.zero; // ✅ 가능
await Task.Delay(1000);
transform.position = Vector3.one; // ✅ 가능 (자동으로 메인 스레드 복귀)
}
: 백그라운드 스레드 풀에서 작업 실행
async Task CorrectUsage()
{
// 1. 백그라운드에서 계산만
int result = await Task.Run(() => {
int sum = 0;
for (int i = 0; i < 1000000; i++)
sum += i;
return sum; // Unity API 안 씀 ✅
});
// 2. await 이후 자동으로 메인 스레드로 복귀
Debug.Log($"결과: {result}"); // ✅ 안전
transform.position = new Vector3(result, 0, 0); // ✅ 안전
}
async 메서드가 반환하는 Task는 WaitingForActivation에서 시작한다:
Created 상태는 new Task()로 직접 만든 cold task 전용이라, async/await 코드에서는 보이지 않는다.
async Task ExampleFlow()
{
Debug.Log("1. 시작");
await Task.Delay(1000); // 여기서 메서드 일시 중단
Debug.Log("2. 1초 후"); // Task 완료 후 재개
}
실제 실행 순서:
서로 다른 객체가 서로의 상태를 알아야하는 상황은 굉장히 자주 나오고, 어찌보면 객체지향 프로그래밍의 대부분의 고민이 여기서 비롯되는 것도 같다. 내가 지금껏 개발하며 사용한 패턴이나 전략들의 장단점을 모았다. 싱글턴 클래스 개념 단 한 개의 인스턴스만 존재하도록 하면서, static 으로 전역적인 접근이 가능하도록 하는 클래스. 장점 구현이 매우 빠르다.
람다람쥐
Delegate 연습
서로 다른 객체가 서로의 상태를 알아야하는 상황은 굉장히 자주 나오고, 어찌보면 객체지향 프로그래밍의 대부분의 고민이 여기서 비롯되는 것도 같다. 내가 지금껏 개발하며 사용한 패턴이나 전략들의 장단점을 모았다. 싱글턴 클래스 개념 단 한 개의 인스턴스만 존재하도록 하면서, static 으로 전역적인 접근이 가능하도록 하는 클래스. 장점 구현이 매우 빠르다.
람다람쥐
Delegate 연습

