У меня есть кнопка, которая имеет обработчик async
, который вызывает ожидание по асинхронному методу. Вот как это выглядит:Reentrancy in async/wait?
private async void Button1_OnClick(object sender, RoutedEventArgs e)
{
await IpChangedReactor.UpdateIps();
}
Вот как выглядит IpChangedReactor.UpdateIps()
:
public async Task UpdateIps()
{
await UpdateCurrentIp();
await UpdateUserIps();
}
Это асинхронной весь путь вниз.
Теперь у меня есть DispatcherTimer
, который неоднократно называет await IpChangedReactor.UpdateIps
в своем галочке.
Предположим, я нажал кнопку. Теперь обработчик событий ожидает на UpdateIps
и возвращается к вызывающему, это означает, что WPF продолжит делать другие вещи. Тем временем, если таймер выстрелил, он снова вызовет UpdateIps
, и теперь оба метода будут выполняться одновременно. Таким образом, я вижу, что он похож на использование 2 потоков. Возможны ли условия гонки? (Часть меня говорит «нет», потому что все работает в одном потоке, но это запутывает)
Я знаю, что методы асинхронизации не обязательно работают на отдельных потоках. Однако в этом случае это довольно запутанно.
Если бы я использовал синхронные методы здесь, он работал бы так, как ожидалось. Событие таймера будет запускаться только после завершения первого вызова.
Может кто-нибудь просветить меня?
Термин, который вы пытаетесь найти, это «[Reentrancy] (https://en.wikipedia.org/wiki/Reentrancy_ (вычисления)) »:« * При вычислении компьютерная программа или подпрограмма называется реентерабельным, если ее можно прервать в середине ее выполнения, а затем безопасно вызвать снова («повторно введенный») до завершения его предыдущих вызовов. * « –