Мне любопытно, что async ожидает встроенные функции потоковой передачи.
Все говорят, что async намного лучше в случае производительности, потому что он освобождает потоки, ожидающие ответа на длинный асинхронный вызов. Хорошо, я понял.
Но рассмотрим этот сценарий.
У меня есть async methodA, выполняющий операцию async в базе данных. Api базы данных предоставляет функцию BeginQuery и событие QueryCompleted. Я завернул их в задачу (с использованием TaskCompletionSource).
Мой вопрос заключается в том, что происходит под капотом между вызовом BeginQuery и срабатыванием QueryCompleted.
Я имею в виду - не нужно ли создавать какого-то рабочего, чтобы запустить это событие? На очень низком уровне должен быть некоторый синхронный цикл, который блокирует результат чтения нити с db.
Я полагаю, что любой асинхронный вызов должен генерировать поток, чтобы фактически обрабатывать ответ (возможно, дождаться его в цикле с низким уровнем С++ в коде драйвера).
Итак, наш единственный "выигрыш" заключается в том, что поток вызывающего может быть освобожден, когда какой-то другой поток выполняет свою работу.
При вызове асинхронного метода всегда создается новый рабочий поток?
Может ли кто-нибудь подтвердить мое понимание?