Я сейчас нахожусь в состоянии гонки из-за ожидания в течение 0,25 секунд в асинхронной функции c. Токен отмены проверяется в l oop, но происходит поздно из-за ожидания.
Я использую библиотеку, которая предоставляет функциональность Await.Until, которая позволяет ожидать логических значений. Поэтому я подумал, что ожидание либо 0,25 секунды, либо token.isCancelled будет иметь значение true.
Я уверен, что аутсорсинг их для разделения задач, а затем использование Task.waitAny () будет работать, но, похоже, немного поверх. Существует ли более элегантный способ ожидания нескольких ожидаемых объектов?
while (!Completed)
{
Completed = AdjustPath();
await Await.Seconds(PathingDelay);
if (!loop)
return Completed;
else if (token.IsCancellationRequested)
{
StopMove();
return false;
}
}
Проблема, описанная выше, заключается в том, что содержащая функция вызывается снова, которая устанавливает конечный пункт перед разрешением отмены, который останавливает объект и удаляет объект пункт назначения. Хотя я мог бы дождаться завершения задачи, это добавило бы задержку к запуску метода, что не идеально.