본문 바로가기
유니티

CancellationTokenSource test code

by 유니티세상 2026. 3. 13.
반응형

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