Подтвердить что ты не робот

Какая разница между BeginConnect и ConnectAsync?

В чем разница между BeginConnect и ConnectAsync? Впоследствии, какова разница между BeginDisconnect и DisconnectAsync?

В документации ConnectAsync указано:

"Начинает асинхронный запрос для подключения удаленного хоста.

В документации BeginConnect также указано:

"Начинает асинхронный запрос для подключения удаленного хоста.

Оба DisconnectAsync и BeginDisconnect также указывают одно и то же:

"Начинает асинхронный запрос на отсоединение от удаленной конечной точки."

Какая разница между этими парами методов и какой из них следует использовать?

4b9b3361

Ответ 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 значительно сложнее реализовать и получить небольшую выгоду для чего-либо, кроме сервисов уровня предприятия.