Re[2]: Из синхронного сокета в асинхронный
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 28.10.11 06:28
Оценка:
Здравствуйте, Murom, Вы писали:

N>>В MSDN есть замечательный пример получения кода html страницы, но к сожалению в этом примере производится блокирование до тех пор, пока не будет принята вся страница. Если не сложно помогите пожалуйста переделать его под асинхронные сокеты, буду премного благодарен за помощь.


M>Всю работу с синхронным сокетом в отдельный поток, и асинхронное взаимодействие с потоком сокета.


Синхронная работа с сокетом в новом потоке — это совсем не тоже самое, что и использование асинхронного API этого сокета. Разница заключается в эффективности и потреблении ресурсов. При использовании нативных асинхронных операций будут использованы соответствующие механизмы ОС, типа портов завершения или других механизмов асинхронного взаимодействия уровня ОС, что *значительно* более эффективно, по сравнению с ручным созданием потока и работы из него.

Простой пример (только с сервером, а не с клиентом): если мы для каждого входного соединения будем создавать новый поток, то на каждое новое подключение будет тратиться как минимум 1Мб памяти, при этом обработка данных также будет производиться в новом потоке. Но одновременно в сотне потоков обрабатывать данные очень не эффективно при наличии 4-х физических процессоров. Используя же асинхронный API класса TcpListener количеством активных потоков будет управлять порт ввода-вывода, который обеспечит максимальную эффективность обработки в зависимости от количества и загрузки текущих аппаратных ресурсов.

Примеры асинхронной работы: TcpClient.BeginConnect и Socket.BeginReceive
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.