PragmaGames
@PragmaGames
Увлекаюсь Unity.

Как правильно подождать выполнения всех тасок через Awaiter?

Всем привет. Есть IEnumerable> tasks, Нужно запустить каждую с одинаковым делеем и после подождать выполнения всех и выйти с метода. bool возвращает выполнена таска полностью или нет, если не выполнена нужно выйти из метода со значением false, если все GetResult == true выходим со значением true. Если во время запуска тасок одна из них была завершена со значением false прекращаем запуск остальных и выходим.

[Serializable]
    public class DelayedSequence : IRunnable
    {
        [SerializeField] private float _delay;

        public async UniTask<bool> Run(IEnumerable<UniTask<bool>> tasks)
        {
            var awaiters = new List<UniTask<bool>.Awaiter>();
                
            foreach (var task in tasks)
            {
                awaiters.Add(task.GetAwaiter());

                await UniTask.Delay(TimeSpan.FromSeconds(_delay));

                foreach (var awaiter in awaiters)
                {
                    if (!awaiter.IsCompleted)
                    {
                        continue;
                    }

                    if (!awaiter.GetResult())
                    {
                        return false;
                    }
                }
            }

            while (true)
            {
                var countCompletes = awaiters.Count;
                
                foreach (var awaiter in awaiters)
                {
                    if (!awaiter.IsCompleted)
                    {
                        countCompletes--;

                        if (countCompletes == 0)
                        {
                            return awaiters.All(item => item.GetResult());
                        }
                        
                        continue;
                    }

                    if (!awaiter.GetResult())
                    {
                        return false;
                    }
                }

                await UniTask.Yield();
            }
        }
    }
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы