Какая разница между BeginConnect и ConnectAsync?
В чем разница между BeginConnect
и ConnectAsync
? Впоследствии, какова разница между BeginDisconnect
и DisconnectAsync
?
В документации ConnectAsync
указано:
"Начинает асинхронный запрос для подключения удаленного хоста.
В документации BeginConnect
также указано:
"Начинает асинхронный запрос для подключения удаленного хоста.
Оба DisconnectAsync
и BeginDisconnect
также указывают одно и то же:
"Начинает асинхронный запрос на отсоединение от удаленной конечной точки."
Какая разница между этими парами методов и какой из них следует использовать?
Ответы
Ответ 1
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?
Ответ 2
Были введены методы XXXXAsync, поскольку они уменьшают количество операций с памятью, возникающее, когда серверы имеют множество подключенных клиентов. В сочетании с объединением, описанным в документах, использование этого API значительно сокращает объем работы GC, который должен выполняться по сравнению со старым API BeginXXX.
docs говорят следующее:
Основной особенностью этих улучшений является предотвращение повторного выделения и синхронизации объектов во время высокопроизводительных асинхронных входов/выходов сокетов. Шаблон проектирования Begin/End, который в настоящее время реализуется классом System.Net.Sockets.Socket, требует, чтобы для каждой операции асинхронного сокета был назначен объект System.IAsyncResult.
Итак, если вы не пишете сервер для многих тысяч подключенных клиентов, я бы не стал беспокоиться о XXXXAsync. API значительно сложнее реализовать и получить небольшую выгоду для чего-либо, кроме сервисов уровня предприятия.