1. Task
Task는 스레드가 실행할 작업 단위(논리적 작업)이며, 실행 상태와 완료 여부를 확인할 수 있다.
주요 특징
- 상태 확인 가능
- Task.Status (Running, Waiting, Completed, Faulted 등)
- IsCompleted, IsFaulted, IsCanceled
- 내부적으로 ThreadPool을 사용하여 실행됨
- 작업 결과 및 예외를 포함함
예외 처리
Task 내부에서 발생한 예외는 자동으로 밖으로 던져지지 않는다.
반드시 await 또는 명시적 접근으로 처리해야 한다.
try
{
await SomeTask();
}
catch (Exception exception)
{
// 예외 처리
}
2. Task.WhenAll
여러 Task를 병렬로 실행하고 모두 완료될 때까지 기다릴 때 사용한다.
await Task.WhenAll(task1, task2, task3);
특징:
- 모든 작업이 병렬 실행됨
- 하나라도 실패하면 전체가 Faulted 상태가 됨
3. async / await
비동기 코드를 작성하기 위한 키워드
async
- 메서드를 비동기로 선언
- 내부에서 await 사용 가능
await
- 작업이 끝날 때까지 기다린 후 이어서 실행
- 스레드를 블로킹하지 않음 (중요)
public async Task ExampleAsync()
{
await Task.Delay(1000);
}
핵심:
- await는 “대기”가 아니라 “이후 실행을 예약”하는 개념
4. Task 연속 작업
ContinueWith
Task 완료 이후 작업을 이어서 실행
task.ContinueWith(t => { /* 후속 작업 */ });
하지만 실무에서는 다음 이유로 잘 사용하지 않는다:
- 스레드 컨텍스트 관리가 어려움
- 코드 가독성이 떨어짐
대신 await 사용이 권장됨
await task;
DoNextWork();
5. Task vs Thread
구조
프로세스
└── 스레드 (실제 실행 단위)
└── Task (작업 단위)
차이
| 구분 | Thread | Task |
| 레벨 | OS | .NET |
| 역할 | 실행 주체 | 작업 단위 |
| 관리 | 직접 관리 | 자동 스케줄링 |
| 사용 목적 | 저수준 제어 | 비동기/병렬 작업 |
핵심:
- Thread는 실제 실행 단위
- Task는 실행할 작업
- Task는 ThreadPool을 통해 병렬 실행 가능
6. Deadlock
둘 이상의 스레드가 서로 자원을 점유한 상태에서
서로의 자원을 기다리며 무한 대기하는 상태
예시
- 스레드 A: lock A → lock B 대기
- 스레드 B: lock B → lock A 대기
7. Deadlock 해결 방법
1. lock 순서 통일
모든 코드에서 동일한 순서로 lock 획득
2. lock 최소화
필요한 구간에만 lock 적용
3. 중첩 lock 제거
lock 안에서 또 다른 lock 사용 지양
4. 타임아웃 사용 (Monitor)
if (Monitor.TryEnter(lockObj, 1000))
{
try
{
// 작업
}
finally
{
Monitor.Exit(lockObj);
}
}
주의
- lock 자체는 데드락을 방지하지 않는다
- Mutex도 데드락을 해결하지 않는다 (동일하게 발생 가능)
최종 요약
- Task는 스레드가 실행하는 작업 단위이며 상태와 결과를 가진다
- async/await는 비동기 흐름을 쉽게 작성하기 위한 문법이다
- Task는 ThreadPool을 통해 병렬 실행될 수 있다
- ContinueWith 대신 await 사용이 권장된다
- Deadlock은 잘못된 lock 사용으로 발생하며, 설계로 예방해야 한다
참고)
https://wjunsea.tistory.com/141
C# 비동기 프로그래밍 : Thread와 Task의 차이점
1. C# 비동기 프로그래밍 : Task 이해 2. C# 비동기 프로그래밍 : async, await 이해 3. C# 비동기 프로그래밍 : Task의 연속 작업 (Continuations) 이해 4. C# 비동기 프로그래밍 : Task와 Thread의 차이점 이번 포스
wjunsea.tistory.com
https://castlejune.tistory.com/55
스레드 풀(Thread pool) 제대로 이해하기
Thread per request model 백엔드 API 서버에서 요청을 처리하는 여러가지 방식이 있는데 그 중 하나가 Thread per request model 이다. Thread per request model 에서는 하나의 API Request 는 하나의 Thread가 처리하게 되
castlejune.tistory.com
'유니티' 카테고리의 다른 글
| TextMeshPro(TMP) <link></link>, unity 텍스트 하이퍼링크 (0) | 2026.04.23 |
|---|---|
| AES-256 이란? (0) | 2026.04.01 |
| c# 람다(Lambda)란? (0) | 2026.03.31 |
| c# _ (0) | 2026.03.31 |
| Unity 6 와이어프레임 안보임 (0) | 2026.03.24 |