반응형
C#에서 비동기 작업을 취소할 때 사용함
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
/*
[Play() 호출]
→ PlayAsync 시작
→ 루프 1: ThrowIfCancellationRequested() (통과) → elapsed 갱신 → await Task.Yield() → 대기
[다른 곳에서 Stop() 호출]
→ ClearToken() → Cancel() → 토큰이 "취소 요청됨"으로 변경
[다음 프레임]
→ Task.Yield() 완료 → 루프 맨 앞으로 복귀
→ ThrowIfCancellationRequested() → 취소됨 감지 → TaskCanceledException throw
→ Play()의 catch (TaskCanceledException)에서 "Play 취소" 로그
*/
public class CancellationExample : MonoBehaviour
{
private CancellationTokenSource cancellationTokenSource;
//1번 실행
public async void Play()
{
ClearToken();
cancellationTokenSource = new CancellationTokenSource();//취소 토큰 소스 생성
CancellationToken cancellationToken = cancellationTokenSource.Token; //취소 토큰 생성
try
{
await PlayAsync(cancellationToken);
}
catch(TaskCanceledException)//TaskCanceledException: 작업이 취소되었을 때 발생하는 예외
{
//6번 취소되었을 때 실행 (3번에서 예외 발생 시 여기로 이동)
Debug.Log("Play 취소");
}
}
public void Stop()
{
ClearToken();
}
//2번 실행
private async Task PlayAsync(CancellationToken cancellationToken)
{
float elapsed = 0f;
float duration = 5f;
while(elapsed < duration)
{
//3번 취소 요청이 있는지 확인. 취소 요청 시 예외 발생 → 6번(catch)으로 이동
cancellationToken.ThrowIfCancellationRequested();//취소 토큰이 요청되었을 때 예외 발생
//4번 경과시간 갱신
elapsed += Time.deltaTime;
//5번 대기 (다음 프레임에 루프 맨 앞(3번)부터 재개)
await Task.Yield();//현재 쓰레드를 대기 상태로 전환하고 다음 프레임에서 계속 진행
}
}
private void ClearToken()
{
if(cancellationTokenSource != null)
{
cancellationTokenSource.Cancel();//취소 토큰 소스 취소
cancellationTokenSource.Dispose();//취소 토큰 소스 해제
cancellationTokenSource = null;
}
}
}
일반 C# / .NET에서
네트워크 요청
예:
- API 요청 보내기
- 유저가 화면 나가면 요청 취소
파일 다운로드 / 업로드
예:
- 다운로드 중 취소 버튼 누름
데이터베이스 조회
예:
- 검색 중 다른 검색어를 입력하면 이전 조회 취소
긴 연산 작업
예:
- 대량 데이터 처리
- 이미지 변환
- 보고서 생성
반응형
'유니티' 카테고리의 다른 글
| [Unity Linux Server] GLIBC란? (0) | 2026.03.17 |
|---|---|
| 프레임을 건너뛴다라는게 무슨말일까? (0) | 2026.03.13 |
| Addressables 세팅 방법 및 샘플 코드 (0) | 2026.03.12 |
| Unity Garbage Collection (0) | 2026.03.11 |
| TIL . Unity Addressables (0) | 2026.03.11 |