여러개의 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 모두 완료될 때까지 기다린 다음 각 작업의 결과를 사용할 수 있다
모든 작업의 완료를 기다릴 때 유용하다