Ответ Джона, конечно, великолепен;Я подумал, что просто добавлю еще одну вещь.
Рассмотрим приложение WinForms с одной кнопкой на форме, которая запускает код при нажатии кнопки.
Что происходит, когда вы не нажатием кнопки?Ничего такого.Процесс существует, код выполняется, но, похоже, ничего не делает.На самом деле он обрабатывает сообщения в потоке пользовательского интерфейса и определяет, что ни одно из них не интересно, но не похоже, что он делает что-то интересное.
Когда вы нажимаете кнопку, внезапно один изэти сообщения интересны, и насос сообщений знает, что когда он видит это событие щелчка, он должен запустить некоторый код.Так оно и есть.
Сценарий асинхронности на одном потоке точно такой же.Продолжение - код «что делать после завершения задачи» фактически является «обработчиком события» события «задача выполнена».Когда задача завершается, она «нажимает кнопку» и помещает сообщение в очередь сообщений потока пользовательского интерфейса.Неважно, делает ли это это из потока пользовательского интерфейса или из потока завершения ввода-вывода или чего-то еще.Когда поток пользовательского интерфейса приступает к обработке этого сообщения, он вызывает продолжение.Точно так же, как когда поток пользовательского интерфейса приступает к обработке нажатия кнопки, он вызывает обработчик нажатия.