유니티/개념 정리
Task
fore4022
2024. 8. 23. 20:39
멀티 스레드 환경에서 대기 가능한 비동기 처리를 해준다.
기존의 스레드에서 대기를 통한 다양한 기능을 구현할 수 있다.
Task, Task<TResult>란?
Task
- 비동기 작업을 담는 스레드를 나타낸다.
- 반환 값이 없다.
Task<TResult>
- 값을 반환 해주는 비동기 작업을 담는 스레드를 나타낸다.
- Result를 통하여 값을 받아올 수 있다.
- 반환 형식은 Task<T>이다.
- Task.Run()을 통해서 람다로 작성된 Task를 실행해 줄 수 있다.
Task를 통한 대기 작업
await를 사용하여서 await 뒤에 나오는 동작의 수행이 완료될 때까지 대기하게 해준다. 편하게 콜백이라고 생각하면 된다.
주의할 점
- 모든 유니티의 api는 메인 스레드에서만 사용할 수 있다.
- 메인 스레드에서 비동기를 통한 대기 작업을 함부로 수행하면, 메인 스레드의 동작이 멈춰버릴 수 있다.
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'이라고 출력되는 모습을 확인할 수 있다.