В чем разница между BeginConnect и ConnectAsync?

в чем разница между BeginConnect и ConnectAsync? Следовательно, в чем разница между BeginDisconnect и DisconnectAsync?

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

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

на BeginConnect документация и гласит:

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

и DisconnectAsync и BeginDisconnect также заявить то же самое:

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

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

2 ответов


гнездо.ConnectAsync предоставляет SocketAsyncEventArgs как параметры, которые содержат гораздо больше информации по сравнению с 3 парами, предоставленными BeginConnect. Также я знаю, что ConnectAsync введен позже, чем BeginConnect и решает некоторые проблемы, связанные с тайм-аутами (не могу вспомнить источник этого обсуждения сейчас). Предпочитайте ConnectAsync, когда это возможно (хотя для этого требуется min .NET 2.0 SP1).

существует уловка с ConnectAsync о обратных вызовах. Если это вызывает беспокойство, вот дискуссии об этом: переполнение стека при использовании системы.Сеть.Розетки.Розетка.AcceptAsync model и AsyncCallBack CompletedSynchronously

в Silverlight нет поддержки метода BeginConnect (поддерживается только ConnectAsync), поэтому это может быть другой проблемой, если вы собираетесь разрабатывать приложения Silverlight на стороне клиента.

также шаблоны, используемые в двух подходах, различны. Вот обсуждение:есть ли разница в производительности между Begin* и * Async для сокетов в .NET?


методы XXXXAsync были введены, потому что они уменьшают объем обмолота памяти, который происходит, когда серверы имеют много подключенных клиентов. В сочетании с описано объединение в документы, использование этого API значительно уменьшает объем работы, которую должен выполнить GC по сравнению со старым API BeginXXX.

на документы говорят следующее:

главная особенность этих улучшений избегание повторное выделение и синхронизация объектов во время высокообъемного асинхронного ввода-вывода сокета.шаблон проектирования Begin/End, реализуемый в настоящее время системой.Сеть.Розетки.Класс сокета требует системы.Объект IAsyncResult будет выделен для каждой операции асинхронного сокета.

Итак, если вы не пишете сервер для многих тысяч подключенных клиентов, я бы не стал беспокоиться о XXXXAsync. API значительно сложнее реализовать и мало что выигрывает от чего-либо, кроме услуги корпоративного уровня.