petushok55
@petushok55
Обучаюсь на практике.

Как остановить выполнение цикла в async методе в Unity (РЕШЕНО)?

После выключения игры в инспекторе, цикл продолжает выполняться.
Прочитал где-то, что нужен токен отмены, но не понимаю что это

private async void PingSender()
    {
        while (status == 1)
        {
            WebSocketClient.Send("ping");
            Debug.Log("ping"); // благодаря этому я заметил, что цикл продолжается даже после выключения игры в инспекторе
            await Task.Delay(1000);
        }
    }
  • Вопрос задан
  • 277 просмотров
Решения вопроса 1
petushok55
@petushok55 Автор вопроса
Обучаюсь на практике.
Я разобрался что к чему.
Нужно вот таким образом создать токен отмены и передать его в async метод
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
MyAsyncMetod(token);

В самом методе внутри цикла (while, for или что у вас там) проверяем токен так
if (token.IsCancellationRequested)
            {
                Debug.Log("токен сказал остановиться!");
                throw new OperationCanceledException(token);
            }

Далее, в MonoBehaviour, например при закрытии приложения, делаем отмену токена
void OnApplicationQuit()
    {
        cts.Cancel();
    }


Ничего сложного, а я боялся
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Потому что отпуск клавиши Play это не выход из игры. Вот когда редактор закроешь, тогда и выйдет. Используй CancelationToken ну или хотя бы при OnDestroy status меняй.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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