2016-10-14 6 views
0

Я использую Начало/EndAccept/Send/Receive методы для сокетов в C# на некоторое время, но только недавно узнал о Блокирующем варианте BOOL для System.Net.SocketsЦели Socket.Blocking

Is это лучшая альтернатива? Если нет, в чем заключается цель указать, следует ли блокировать ваш Socket? Это всего лишь полезный показатель того, решил ли разработчик реализовать блокирующие/неблокирующие методы?

ответ

2

Попытка вызвать вызов Receive на блокирующий сокет означает, что вызов не вернется, пока не поступят данные. При использовании блокирующих сокетов ваш поток эффективно останавливается до тех пор, пока не будут доступны данные. Поэтому, если вы попытаетесь выполнить ввод/вывод сокетов в потоке пользовательского интерфейса приложения Winforms, ваш пользовательский интерфейс не будет реагировать и заморожен до тех пор, пока не поступят данные.

Неблокирующие сокеты позволяют вашему коду делать что-то еще. Если вы вызываете Receive в неблокирующий сокет, он немедленно возвращается, если нет доступных данных. Неблокированные сокеты часто используются в сочетании с механизмом периодического опроса, «выбрать» стиль ожидания вызова или другим механизмом уведомления, чтобы указать, что данные доступны. .NET также предлагает метод BeginReceive на сокете в качестве другой альтернативы.

Выбор между «блокировкой» и «неблокировкой» является выбором дизайна. Выбор влияет либо на модель резьбы (или на модель резьбы влияет на решение). Оба имеют конструктивные последствия.

Ранние версии .NET не предлагали BeginReceive IIRC. Асинхронный ожидания не был доступен до тех пор, пока он не появится в версиях .NET. Традиционные модели сокетов на большинстве платформ - это просто «отправить» и «recv» с возможностью установки неблокирующего режима.

+0

Блокирующий сокет также может вставляться в «Отправить», также может блокироваться до тех пор, пока данные не смогут быть отправлены (зависит от размера окна TCP). – selbie