await()
может вызвать возврат из асинхронного метода c, но его выполнение не завершено, он будет вызван снова через некоторое время. Чтобы быть вызванным позже, он попадает в строку с некоторым событием перед возвратом, так же, как поток может вызвать Object.wait()
в Java, что означает, что поток попадает в строку к какому-либо событию и покидает процессор. Метод Asyn c покидает поток, поскольку поток играет для него роль процессора.
, когда происходит событие, метод asyn c возобновляется, то есть он просто вызывается снова в следующем доступном потоке пула потоков - точно так же, как поток после того, как wait () запускается на следующем доступном процессоре. Чтобы продолжить выполнение не с самого начала, а с последнего места, откуда оно вернулось из-за await()
, информация о состоянии сохраняется и затем используется в виде:
switch(state) {
case 0: goto 0';
case 1: goto 10';
....
}
Обратите внимание, что это байт-код, поэтому можно использовать goto
. Чтобы сохранить состояние, нам нужно поле объекта, поэтому метод asyn c на самом деле является не методом, а классом, который создается в том месте, где он вызывается впервые.
Из-за прямое использование goto
, трудно или иногда невозможно закодировать asyn c метод простым C# или Java. Но всегда можно закодировать каждую часть метода asyn c как отдельный метод и использовать эти методы в качестве обратных вызовов для ожидаемых событий. Async / await - это просто еще один синтаксис для асинхронного программирования, наряду с обратными вызовами, актерами, ComplatableFuture, java .util.concurrent.Flow et c.