Вся идея TAP (шаблон задачи Asyn c) состоит в том, что один поток может обслуживать множество вещей «одновременно», потому что он может go вернуться к тому, что делал раньше, в любое время, когда await
в процессе. Вот почему асин c маркировка на методах имеет тенденцию быть на каждом методе вплоть до иерархии, начиная с первой точки, которую код, который вы пишете (ваш метод Get-метод, например), через каждый метод, который вы вызываете, вплоть до где нужно ждать что-то вроде БД или сетевого ввода-вывода.
Встреча await
немного похожа на создание необработанного исключения - поток управления идет обратно по всему стеку методов, который является вашим кодом, и, вернувшись, возвращается к тому, что происходило до этого. вне вашего кода. Разница между сгенерированным исключением и конечным автоматом ожидания состоит в том, что, когда ожидаемая задача выполнена, поток, завершивший выполнение других задач, вернется туда, где находится ожидание, и продолжит оттуда
Что раньше это было очень контекстно - в вашем случае это, вероятно, «ожидание TCP-клиента для соединения и отправки некоторых данных»
Теперь, в вашем коде поток возвращается к тому, что он делал раньше - вы Допустим, это занимает 15 секунд, поэтому поток будет занят другими вещами в течение 15 секунд, затем он вернется и будет ждать завершения задачи 1000 мс, затем он округлит oop и выдаст другой запрос. На практике это означает, что каждые 16 секунд ваш код отправляет запрос; не просьба каждую секунду, на которую вы надеялись. Используйте таймер