2011-03-05 11 views
16

Mi aplicación necesita transmitir rápidamente un mensaje a un gran número de clientes (1000-s) y recopilar resultados.¿Hay alguna diferencia de rendimiento entre Begin * y * Async para sockets en .NET?

Estoy pensando si desea utilizar los BeginSend/endSend etc. familias de funciones, o para usar el SendAsync familia - ¿hay alguna diferencia de rendimiento? ¿Cuál es su diferencia en absoluto, a excepción de la familia * Async que no requiere la asignación de un IAsyncResult?

Si entiendo bien, ambos usan puertos de terminación de IO y el grupo de subprocesos de .NET estándar ... ¿Cuál es la diferencia?

Respuesta

17

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

SendAsync en hechos utilizan un Event-Based Pattern. BeginSend y EndSend usan el IAsyncResult pattern.

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

Extracto de la última parte:

Mientras que el modelo asincrónico basado en eventos tiene muchas ventajas resultantes de los escenarios mencionados anteriormente, se tiene algunos inconvenientes, que se 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. El bloqueo de espera en muchos IAsyncResult objetos

  3. Sondeo para completar en IAsyncResult

Usted puede abordar estos escenarios por utilizando el patrón basado en eventos, pero hacerlo es más engorroso que el uso de el patrón IAsyncResult.

desarrolladores a menudo usan el patrón IAsyncResult por servicios que normalmente tienen de muy alto rendimiento requisitos. Por ejemplo, el sondeo para el escenario de finalización 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 sincroniza a través de roscas.

La siguiente lista muestra algunos recomendaciones a seguir si decide usar el patrón IAsyncResult :

  • Sólo exponga el patrón IAsyncResult cuando se requiere específicamente apoyo a WaitHandle o IAsyncResult objetos.

  • Exponga únicamente el patrón IAsyncResult cuando tiene una API existente que utiliza el patrón IAsyncResult.

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

  • Sólo exponer patrón IAsyncResult si tiene alto rendimiento requisitos que usted ha verificado no pueden ser satisfechas por el patrón basado en eventos pero pueden ser satisfechas por el IAsyncResult patrón.

+0

Así que ellos usan exactamente el mismo mecanismo subyacente, tienen exactamente la misma cantidad de bloquear o cambios de contexto en los mismos casos, etc.? ¿Podrías por favor dar una referencia? – jkff

+0

No puede, no sabe quién votó en contra de su respuesta. –

+0

@Hans: ¿qué? @jkff: vea la respuesta actualizada. –

Cuestiones relacionadas