remarks example c# sockets asynchronous connect disconnect

c# - example - ¿Cuál es la diferencia entre BeginConnect y ConnectAsync?



params comments c# (2)

¿Cuál es la diferencia entre BeginConnect y ConnectAsync ? Posteriormente, ¿cuál es la diferencia entre BeginDisconnect y DisconnectAsync ?

La documentación de ConnectAsync establece:

"Comienza una solicitud asincrónica para una conexión de host remota".

La documentación de BeginConnect también declara:

"Comienza una solicitud asincrónica para una conexión de host remota".

Tanto el DisconnectAsync como el BeginDisconnect también dicen lo mismo:

"Comienza una solicitud asincrónica para desconectarse de un punto final remoto".

¿Cuál es la diferencia entre esos pares de métodos y cuál debería usarse?


Los métodos XXXXAsync se introdujeron porque reducen la cantidad de agolpamiento de memoria que se produce cuando los servidores tienen muchos clientes conectados. Junto con la agrupación descrita en los documentos , el uso de esta API reduce considerablemente la cantidad de trabajo que GC debe realizar en comparación con la anterior API BeginXXX.

Los documentos dicen lo siguiente :

La característica principal de estas mejoras es la evitación de la asignación repetida y la sincronización de objetos durante la E / S de socket asíncrona de alto volumen. El patrón de diseño Begin / End actualmente implementado por la clase System.Net.Sockets.Socket requiere que se asigne un objeto System.IAsyncResult para cada operación de socket asíncrono.

Entonces, a menos que esté escribiendo un servidor para muchos miles de clientes conectados, no me molestaría con XXXXAsync. La API es considerablemente más difícil de implementar y tiene poca ganancia para otros servicios que no sean de nivel empresarial.


Socket.ConnectAsync proporciona SocketAsyncEventArgs como parámetros que contiene mucha más información en comparación con 3 parámetros proporcionados por BeginConnect. También sé que ConnectAsync presentó más adelante que BeginConnect y resuelve algunos problemas relacionados con los tiempos de espera (no recuerdo el origen de esta discusión ahora). Prefiera ConnectAsync cuando sea posible (aunque requiere min .NET 2.0 SP1).

Hay un inconveniente con ConnectAsync sobre las devoluciones de llamada. Si esto es motivo de preocupación, aquí están las discusiones al respecto: Desbordamiento de pila cuando se utiliza el modelo System.Net.Sockets.Socket.AcceptAsync y AsyncCallBack CompletedSynchronously

No hay soporte para el método BeginConnect en Silverlight (solo se admite ConnectAsync) por lo que puede ser otra preocupación si tiene la intención de desarrollar aplicaciones Silverlight del lado del cliente.

Además, los patrones utilizados en dos enfoques son diferentes. Aquí está la discusión: ¿Hay alguna diferencia de rendimiento entre Begin * y * Async para sockets en .NET?