본문 바로가기
PROGRAMING📚/Unity📑

[UNITY]여러개의 Task 받아서 처리하기(Task.WhenAny/WhenAll)

별찌루 2024. 4. 8.
728x90
반응형

여러개의 Task 받아서 처리하기

 

public static Task<Task> WhenAny (params Task[] tasks);

 

Task.WhenAny 메서드는 여러 개의 Task 중 하나가 완료될 때까지 대기하는 데 사용된다

 

tasks 는 비동기 작업(Task) 의 배열로 배열에 있는 작업 중 하나가 완료 될 때까지 대기하고

완료가 되면 Task 의 Task 객체가 반환된다

 

Task.WhenAny 는 여러 작업중 가장 빨리 완료되는 작업을 처리하거나,

병렬 작업중 하나를 선택하는데 사용한다

Task<int> task1 = SomeAsyncOperation1();
Task<int> task2 = SomeAsyncOperation2();
Task<int> task3 = SomeAsyncOperation3();

Task<Task<int>> whenAnyTask = Task.WhenAny(task1, task2, task3);

Task<int> completedTask = await whenAnyTask;

// completedTask는 가장 먼저 완료된 Task입니다.
// 이제 완료된 Task의 결과를 가져와서 처리할 수 있습니다.
int result = await completedTask;

 

위와 같이 사용하면 task1, task2, task3 중 하나가 완료되는 것을 기다리고

완료된 Task의 결과를 가져와서 처리한다

 

더보기

리스트 안에 있는 게임 오브젝트를 비동기식으로 생성하는

Task<Gameobject> 를 작업이 완료가 된 오브젝트가 먼저 생성이 되도록 만들어 주려고 한다

 public async void Load(List<string> assetNames)
        {

            List<Task<GameObject>> AddTasks = new List<Task<GameObject>>();
            foreach (string assetName in assetNames)
            {
                AddTasks.Add(LoaderModule.LoadAssetAsync(assetName));
            }
            List<Task<GameObject>> TaskList = AddTasks.ToList();
            while (TaskList.Any())
            {
                Task<GameObject> finishedTask = await Task.WhenAny(TaskList);
                TaskList.Remove(finishedTask);
            }

        }

 

List 안에 Task를 넣어주고 TaskList 배열을

WhenAny를 사용해서 Task 중에 하나라도 완료 되면 Task 가 반환 될 수 있게 만들어줌

 public async Task<GameObject> LoadAssetAsync(string assetName)
        {
            LoadAsset(assetName);
            GameObject asset = loadAsset;
            await Task.Yield();

            // int RandomT = UnityEngine.Random.RandomRange(0, 3) * 1000;
            // await Task.Delay(RandomT);
            // Debug.Log($"랜덤 시간 : {RandomT}  에셋 이름 {assetName} 불러오는 asset에셋 {asset}");

            if (loadAsset != null)
            {
                GameObject result = Instantiate(asset, transform.position, Quaternion.identity);
                result.transform.SetParent(transform);
                return result;
            }
            else
            {
                return null;
            }
        }

 

public static Task WhenAll (params Task[] tasks);

 

Task.WhenAll 메서드는 여러개의 Task를 받아들이고

받아들인 Task 모두 완료 될 때 까지 대기한다

Task가 모두 완료가 되면 Task 결과를 반환한다

 

 

Task<int> task1 = SomeAsyncOperation1();
Task<int> task2 = SomeAsyncOperation2();
Task<int> task3 = SomeAsyncOperation3();

await Task.WhenAll(task1, task2, task3);

// 여기서 task1, task2, task3 모두 완료되었으므로,
// 이제 각 작업의 결과를 사용할 수 있습니다.
int result1 = await task1;
int result2 = await task2;
int result3 = await task3;

 

task1, task2, task3 모두 완료될 때까지 기다린 다음 각 작업의 결과를 사용할 수 있다

모든 작업의 완료를 기다릴 때 유용하다

728x90
반응형

댓글