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

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

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

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

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

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

Как DisconnectAsync, так и BeginDisconnect также указывает то же самое:

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

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


person Kiril    schedule 23.04.2011    source источник


Ответы (2)


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

В ConnectAsync есть загвоздка с обратными вызовами. Если это вызывает беспокойство, вот обсуждения по этому поводу: model">Переполнение стека при использовании модели System.Net.Sockets.Socket.AcceptAsync и AsyncCallBack CompletedSynchronously

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

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

person Teoman Soygul    schedule 23.04.2011
comment
Я не согласен. Отдайте предпочтение BeginXXX, если производительность не является абсолютно критической. XXXAsync API значительно сложнее реализовать, и он дает мало преимуществ в производительности, если только вы не пишете сервер, который должен обслуживать многие тысячи подключенных клиентов. - person spender; 23.04.2011
comment
В Silverlight нет поддержки Socket.BeginConnect, вы можете догадаться, почему. - person Teoman Soygul; 23.04.2011
comment
Если я не пишу специально для Silverlight, я остаюсь при своем ответе. API BeginXXXX значительно проще реализовать, чем XXXXAsync. - person spender; 23.04.2011
comment
Я всегда использовал ConnectAsync и подобные, поэтому не могу комментировать это. - person Teoman Soygul; 23.04.2011

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

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

Главной особенностью этих улучшений является предотвращение повторного выделения и синхронизации объектов во время асинхронного ввода-вывода большого объема. Шаблон проектирования Begin/End, который в настоящее время реализуется классом System.Net.Sockets.Socket, требует выделения объекта System.IAsyncResult для каждой асинхронной операции с сокетом.

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

person spender    schedule 23.04.2011
comment
когда я пытаюсь повторно использовать сокет, последующие соединения терпят неудачу с вызовами семейства Async и вызовами семейства Begin... можете ли вы пролить свет на этот вопрос: stackoverflow.com/questions/5762276/ - person Kiril; 23.04.2011