.net sockets asynchronous

¿Hay alguna diferencia de rendimiento entre Begin*y*Async para sockets en.NET?



asynchronous (1)

Mi aplicación necesita transmitir rápidamente un mensaje a una gran cantidad de clientes (1000-s) y recopilar resultados.

Estoy pensando si usar las familias de funciones BeginSend / EndSend, etc., o usar la familia SendAsync . ¿Hay alguna diferencia de rendimiento? ¿Cuál es su diferencia, a excepción de la familia * Async que no requiere la asignación de un IAsyncResult?

Si estoy entendiendo correctamente, ambos usan puertos de finalización de E / S y el grupo de subprocesos .net estándar ... ¿Entonces cuál es la diferencia?


La diferencia está solo en el patrón utilizado.

SendAsync en hechos usa un patrón basado en eventos . BeginSend y EndSend utilizan el patrón IAsyncResult .

EDIT: No sé cómo se implementa la interfaz IAsyncResult en la clase Socket , pero aquí hay un document de MSDN que explica cuándo implementar un patrón u otro.

Extracto de la última parte:

Si bien el Patrón asíncrono basado en eventos tiene muchos beneficios en los escenarios mencionados anteriormente, tiene algunos inconvenientes, que debe tener en cuenta si el rendimiento es su requisito más importante.

Hay tres escenarios que el patrón basado en eventos no aborda, así como el patrón IAsyncResult:

  1. Bloqueo de espera en un IAsyncResult

  2. Bloqueo de espera en muchos objetos IAsyncResult

  3. Encuesta para completar en el IAsyncResult

Puede abordar estos escenarios utilizando el patrón basado en eventos, pero hacerlo es más engorroso que usar el patrón IAsyncResult.

Los desarrolladores a menudo usan el patrón IAsyncResult para servicios que normalmente tienen requisitos de rendimiento muy altos. Por ejemplo, el escenario de sondeo para completar es una técnica de servidor de alto rendimiento.

Además, el patrón basado en eventos es menos eficiente que el patrón IAsyncResult porque crea más objetos, especialmente EventArgs, y porque se sincroniza entre los subprocesos.

La siguiente lista muestra algunas recomendaciones a seguir si decide utilizar el patrón IAsyncResult:

  • Solo exponga el patrón IAsyncResult cuando requiera específicamente soporte para los objetos WaitHandle o IAsyncResult.

  • Solo exponga el patrón IAsyncResult cuando tenga una API existente que use el patrón IAsyncResult.

  • Si tiene una API existente basada en el patrón IAsyncResult, considere también exponer el patrón basado en eventos en su próxima versión.

  • Solo exponga el patrón IAsyncResult si tiene requisitos de alto rendimiento que ha verificado que el patrón basado en eventos no puede cumplir, pero sí puede cumplir el patrón IAsyncResult.