В чем разница между BeginConnect и ConnectAsync?
В чем разница между BeginConnect
и ConnectAsync
? Впоследствии, в чем разница между BeginDisconnect
и DisconnectAsync
?
Документация ConnectAsync
гласит:
«Начинает asynchronous запрос для подключения удаленного хоста».
- Ошибка соединения Bluetooth "java.io.IOException: чтение не выполнено, сокет может быть закрыт или таймаут, read ret: -1"
- Что означает «сброс соединения с помощью сверстника»?
- TCP: могут ли два разных сокета совместно использовать порт?
- Нужно ли мне бить сердце, чтобы открыть TCP-соединение?
- «ab» программа зависает после множества запросов, почему?
Документация BeginConnect
также гласит:
«Начинает asynchronous запрос для подключения удаленного хоста».
Оба DisconnectAsync
и BeginDisconnect
также BeginDisconnect
и то же:
«Начинает asynchronous запрос на отсоединение от удаленной конечной точки».
В чем разница между этими парами методов и какой из них следует использовать?
Socket.ConnectAsync предоставляет SocketAsyncEventArgs в качестве параметров, который содержит намного больше информации по сравнению с 3 параметрами, предоставляемыми BeginConnect. Также я знаю, что ConnectAsync представлен позже, чем BeginConnect, и решает некоторые проблемы, связанные с таймаутами (не могу вспомнить источник этой дискуссии сейчас). Предпочитайте ConnectAsync, когда это возможно (хотя для этого требуется минимум .NET 2.0 SP1).
Существует обратная связь с ConnectAsync о обратных вызовах. Если это вызывает озабоченность, обсудим это: переполнение стека при использовании System.Net.Sockets.Socket.AcceptAsync и AsyncCallBack CompletedSynchronously
В Silverlight нет поддержки метода BeginConnect (поддерживается только ConnectAsync), так что это может быть еще одна проблема, если вы собираетесь разрабатывать приложения Silverlight на стороне клиента.
Также шаблоны, используемые в двух подходах, различны. Вот обсуждение: есть ли разница в производительности между Begin * и * Async для сокетов в .NET?
Были введены методы XXXXAsync, поскольку они уменьшают количество операций с памятью, возникающее, когда серверы имеют множество подключенных клиентов. В сочетании с объединением, описанным в документах , использование этого API значительно снижает объем работы GC, который должен выполняться по сравнению с более старым API BeginXXX.
Документы говорят следующее :
Главной особенностью этих улучшений является предотrotation повторного выделения и синхронизации объектов при высокопроизводительных асинхронных вводах-выводах. Шаблон проектирования Begin / End, который в настоящее время реализуется classом System.Net.Sockets.Socket, требует, чтобы для каждой операции асинхронного сокета был назначен объект System.IAsyncResult.
Итак, если вы не пишете сервер для многих тысяч подключенных клиентов, я бы не стал беспокоиться о XXXXAsync. API значительно сложнее реализовать и получить небольшой выигрыш для чего угодно, кроме услуг уровня предприятия.