Я знаю, как работает async.
Вы не являетесь.
Я знаю, что, когда исполнение достигает ждать, то отпустите нить
Это не делает. Когда выполнение достигает ожидания, ожидаемый операнд оценивается, а затем проверяется, завершена ли операция. Если это не так, то оставшаяся часть метода регистрируется как продолжение ожидаемого, и задача, представляющая работу текущего метода, возвращается вызывающему.
Ничто из этого не означает «освобождение нити». Скорее, управление возвращает вызывающему абоненту, и вызывающий абонент продолжает выполнять текущий поток. Конечно, если текущий вызывающий объект был единственным в этом потоке, то поток выполняется. Но нет требования, чтобы асинхронный метод был единственным вызовом в потоке!
после IO завершает
не является awaitable потребность быть операция ввода-вывода, но давайте предположим, что это.
он извлекает поток из threadpool и запускает оставшийся код.
Номер планирует использовать оставшийся код в правильном контексте. Этот контекст может быть нитью. Это может быть поток пользовательского интерфейса. Это может быть текущий поток. Это может быть любое количество вещей.
Должны ли мы использовать методы async для очень быстрого метода ввода-вывода, такие как метод чтения/записи кеша?
Ожидаемая оценка. Если ожидаемый знает, что он может завершить операцию в течение разумного промежутка времени, то она полностью в пределах своих прав выполнять операцию и возвращать завершенную задачу. В этом случае штраф отсутствует; вы просто проверяете логическое значение, чтобы проверить, завершена ли задача.
Не могли бы они привести к ненужному переключателю контекста.
Не обязательно.
Если мы используем метод синхронизации, выполнение будет завершено в том же потоке, и контекстный переключатель может не произойти.
Я смущен, почему вы считаете, что переключатель контекста происходит при операции ввода-вывода. Операции ввода-вывода выполняются на оборудовании, ниже уровня потоков ОС. Там нет нитки, которые там обслуживают задачи IO.
ли Асинхронный-Await сохраняет только потребление памяти (путем создания меньших потоков)
Цель ОЖИДАНИЯ состоит в (1) делают более эффективное использование дорогих рабочих потоков, позволяя рабочие процессы, чтобы стать более асинхронными , и тем самым освобождая потоки для работы в ожидании результатов с высокой задержкой и (2) сделать исходный код для асинхронных рабочих процессов похожими на исходный код для синхронных рабочих процессов.
Насколько я знаю, в случае синхронизации IO, в то время как IO имеет место, нить переходит в спящий режим. Это означает, что он не потребляет процессор. Правильно ли это понимание?
Уверенный, но у вас есть это полностью назад. ВЫ ХОТИТЕ ПОТРЕБИТЬ ЦП. Вы хотите постоянно потреблять как можно больше ЦП! ЦП делает работу от имени пользователя, а если это idle, то он не выполняет свою работу так быстро, как мог. Не нанимайте рабочего, а затем платите им спать! Наймите работника, и как только они будут заблокированы по заданию с высокой задержкой, поставит их на работу, сделав что-то еще, чтобы процессор оставался максимально горячим. Владелец этой машины заплатил хорошие деньги за этот процессор; он должен работать на 100% все время, чтобы была сделана работа!
Итак, давайте вернемся к вашему основному вопросу:
ждут ли асинхронной увеличивает переключение контекста
Я знаю отличный способ узнать. Напишите программу, используя ожидание, напишите еще один, запустите их как, так и измерьте количество переключателей контекста в секунду. Тогда вы узнаете.
Но я не понимаю, почему переменные контекста в секунду являются релевантной метрикой. Рассмотрим два банка с большим количеством клиентов и много сотрудников. В банке № 1 сотрудники работают над одной задачей до ее завершения; они никогда не переключают контекст. Если работник заблокирован, ожидая результата от другого, они переходят спать. В банке № 2 сотрудники переключаются с одной задачи на другую, когда они блокируются, и постоянно обслуживают запросы клиентов. Какой банк, по вашему мнению, быстрее обслуживает клиентов?
async await обязательно не создает новые потоки все время. В SO есть много вопросов, поэтому вам нужно начать поиск. –
Ture, Он тянет поток от ThreadPool для выполнения оставшейся части метода. Это то, что я упомянул – Pragmatic
, асинхронный ожидание - это больше о цепочке операций и позволяет инфраструктуре управлять переключением контекста, если это вообще возможно. –