Re: Чтение из сокета -- APM vs async. Пару вопросов.
От: hi_octane Беларусь  
Дата: 22.03.22 23:02
Оценка: 86 (2)
S>Вопрос: как сейчас грамотнее делать APM или async? Вроде async более понятен для чтения и этот код эквивалентен 1-ому варианту APM.
S>Правильно ли я понимаю, что в обоих случаях будет вызываться iocp-поток? Соотв. если у меня будет много подобных соединений, то и iocp-потоков
S>должно быть много.

Не вижу смысла делать случай 2 по двум причинам: 1) вызовешь ты ReadAsync раньше или позже вообще никак не повлияет на доступность данных — сетевая карта сложит данные в системный буфер когда они придут, и точный момент вызова тут не особо важен 2) rc там теоретически возможен. То есть он может есть, может нет, а может он только на какой-нибудь из поддерживаемых систем появится — это всё будет зависеть от деталей реализации, и ловить будет очень сложно.

По async: внутри сокетов всё переписано на async, и все новые оптимизации продолжают делаться для async. Для .NET6 сам APM эмулируется через обёртки типа TaskToApm, так что у тебя будут и накладные расходы на async и расходы на обёртку. Короче APM разумно оставить в прошлом.

В большинстве случаев сейчас самое правильное использовать или уже готовый паттерн async + System.IO.Pipelines, или свой велосипед написанный по мотивам и ускоряющий какие-то специфичные для задачи сценарии.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.