Если WCF отвечает вашим потребностям, стоит посмотреть. ZeroC и другие альтернативные библиотеки более высокого уровня существуют. В противном случае есть несколько разных способов приблизиться к уровню сокета, если это то, что вам нужно.
TcpClient / UdpClient
Они обеспечивают относительно тонкую обертку вокруг нижних гнезд. По сути, он обеспечивает поток через сокет. Вы можете использовать асинхронные методы в NetworkStream (BeginRead и т. Д.). Мне это не нравится, так как обертка не обеспечивает этого, и это немного более неудобно, чем непосредственное использование сокета.
Гнездо - Выбрать
Это обеспечивает классическую технику Select для мультиплексирования ввода / вывода с несколькими сокетами в один поток. Больше не рекомендуется.
Разъем - APM Style
Модель асинхронного программирования (AKA IAsyncResult, Begin / End Style) для сокетов является основным методом асинхронного использования сокетов. И есть несколько вариантов. По сути, вы вызываете асинхронный метод (например, BeginReceive) и выполняете одно из следующих действий:
- Опрос для завершения на возвращенном IAsyncResult (почти не используется).
- Используйте WaitHandle из IAsyncResult, чтобы дождаться завершения метода.
- Передайте методу BeginXXX метод обратного вызова, который будет выполнен после его завершения.
Лучший способ - № 3, так как он обычно самый удобный. Если сомневаетесь, используйте этот метод.
Некоторые ссылки:
.NET 3.5 Высокопроизводительные сокеты
.NET 3.5 представила новую модель для асинхронных сокетов, которая использует события. Он использует «упрощенную» асинхронную модель (например, Socket.SendAsync). Вместо обратного вызова вы подписываетесь на событие для завершения, и вместо IAsyncResult вы получаете SocketAsyncEventArgs. Идея состоит в том, что вы можете повторно использовать SocketAsyncEventArgs и предварительно выделить память для ввода-вывода сокета. В сценариях с высокой производительностью это может быть намного эффективнее, чем при использовании стиля APM. Кроме того, если вы предварительно выделите память, вы получите стабильный объем памяти, уменьшенный сбор мусора, дыры в памяти от закрепления и т. Д. Обратите внимание, что беспокойство об этом должно учитываться только в сценариях с наиболее высокой производительностью.
Резюме
В большинстве случаев используйте метод обратного вызова стиля APM, если вы не предпочитаете стиль метода SocketAsyncEventArgs / Async. Если вы использовали CompletionPorts в WinSock, вы должны знать, что оба эти метода используют CompletionPorts под капотом.