fore4022 2024. 8. 23. 20:39

멀티 스레드 환경에서 대기 가능한 비동기 처리를 해준다.

기존의 스레드에서 대기를 통한 다양한 기능을 구현할 수 있다.


Task, Task<TResult>란?

Task

  • 비동기 작업을 담는 스레드를 나타낸다.
  • 반환 값이 없다.

Task<TResult>

  • 값을 반환 해주는 비동기 작업을 담는 스레드를 나타낸다.
  • Result를 통하여 값을 받아올 수 있다.
  • 반환 형식은 Task<T>이다.
  • Task.Run()을 통해서 람다로 작성된 Task를 실행해 줄 수 있다.

Task를 통한 대기 작업

await를 사용하여서 await 뒤에 나오는 동작의 수행이 완료될 때까지 대기하게 해준다. 편하게 콜백이라고 생각하면 된다.


주의할 점

  1. 모든 유니티의 api는 메인 스레드에서만 사용할 수 있다.
  2. 메인 스레드에서 비동기를 통한 대기 작업을 함부로 수행하면, 메인 스레드의 동작이 멈춰버릴 수 있다.

using System.Threading.Tasks;
using UnityEngine;
public class Test : MonoBehaviour

    private void Start()
    {
        Task.Run(() => TestMethod());
    }
    private void TestMethod()
    {
        Debug.Log("test");
    }
}
//실행 결과 : Task를 통해서 UnityAPI를 사용하지 못하는, 새로운 스레드에서 TestMethod를 실행하게 되면서 Debug.Log가 출력되지 않는다.
using System.Collections;
using System.Threading.Tasks;
using UnityEngine;
public class Test : MonoBehaviour
{
    private int value = 0;

    private void Start()
    {
        Debug.Log($"value : {value}");

        StartCoroutine(testCoroutine());
    }
    private IEnumerator testCoroutine()
    {
        Task test = new Task(async () => await TestMethod());

        test.Start();

        yield return new WaitUntil(() =>value != 0);

        Debug.Log($"value : {value}");
    }
    private async Task TestMethod()
    {
        await Task.Delay(1000);

        value = 10;
    }
}
//실행 결과 : 'value : 0'이라고 출력되고 난 1초 후에 'value : 10'이라고 출력되는 모습을 확인할 수 있다.