Decidir cuándo implementar el modelo asincrónico basado en eventos

El modelo asincrónico basado en eventos proporciona un modelo para exponer el comportamiento asincrónico de una clase. Con la introducción de este modelo, .NET define dos modelos para exponer el comportamiento asincrónico: el modelo asincrónico basado en la interfaz System.IAsyncResult y el modelo basado en eventos. En este artículo se describe cuándo es adecuado implementarlos.

Para obtener más información sobre la programación asincrónica con la interfaz IAsyncResult, vea Modelo de programación asincrónica (APM).

Principios generales

En general, se deben exponer las características asincrónicas mediante el modelo asincrónico basado en eventos siempre que sea posible. Sin embargo, hay algunos requisitos que el modelo basado en eventos no puede cumplir. En esos casos, puede que necesite implementar el modelo IAsyncResult además del modelo basado en eventos.

Nota

Es raro que el modelo IAsyncResult se implemente sin haber implementado el modelo basado en eventos.

Instrucciones

En la lista siguiente se describen las instrucciones sobre cuándo implementar el modelo asincrónico basado en eventos:

  • Utilice el modelo basado en eventos como la API predeterminada para exponer el comportamiento asincrónico para la clase.

  • No exponga el modelo IAsyncResult cuando la clase se utiliza principalmente en una aplicación cliente, por ejemplo, Windows Forms.

  • Exponga el modelo IAsyncResult solo cuando sea necesario para satisfacer sus requisitos. Por ejemplo, la compatibilidad con una API existente puede requerir que se exponga el modelo IAsyncResult.

  • No exponga el modelo IAsyncResult sin exponer también el modelo basado en eventos.

  • Si debe exponer el modelo IAsyncResult, hágalo como una opción avanzada. Por ejemplo, si genera un objeto proxy, genere el modelo basado en eventos de forma predeterminada, con una opción para generar el modelo IAsyncResult.

  • Compile su implementación del modelo basado en eventos en la implementación del modelo IAsyncResult.

  • Evite exponer tanto el modelo basado en eventos como el modelo IAsyncResult en la misma clase. Exponga el modelo basado en eventos en las clases de "nivel superior" y el modelo IAsyncResult en las clases de "nivel inferior". Por ejemplo, compare el modelo basado en eventos del componente WebClient con el modelo IAsyncResult de la clase HttpRequest.

    • Exponga el modelo basado en eventos y el modelo IAsyncResult en la misma clase cuando lo requiera la compatibilidad. Por ejemplo, si ya ha publicado una API que usa el modelo IAsyncResult, quizá necesite conservar el modelo IAsyncResult por compatibilidad con versiones anteriores.

    • Exponga el modelo basado en eventos y el modelo IAsyncResult en la misma clase si la complejidad del modelo de objetos resultante supera la ventaja de separar las implementaciones. Es mejor exponer ambos modelos en una sola clase que evitar exponer el modelo basado en eventos.

    • Si debe exponer tanto el modelo basado en eventos como el modelo IAsyncResult en una sola clase, use EditorBrowsableAttribute establecido en Advanced para marcar la implementación del modelo IAsyncResult como una característica avanzada. Esto indica a los entornos de diseño, como IntelliSense en Visual Studio, que no muestren las propiedades y los métodos de IAsyncResult. Estas propiedades y métodos todavía son totalmente utilizables, pero el desarrollador que trabaja con IntelliSense tiene una visión más clara de la API.

Criterios para exponer el modelo IAsyncResult además del modelo basado en eventos

Aunque el modelo asincrónico basado en eventos tiene muchas ventajas en los escenarios mencionados anteriormente, también tiene algunas desventajas, que debe tener en cuenta si el rendimiento es el requisito más importante.

Hay tres escenarios que no se abordan con el modelo basado en eventos ni con el modelo IAsyncResult:

Puede resolver estos escenarios con el modelo basado en eventos, pero es más complicado que usar el modelo IAsyncResult.

Los desarrolladores suelen utilizar el modelo IAsyncResult para los servicios que normalmente tienen requisitos de muy alto rendimiento. Por ejemplo, el sondeo para el escenario de finalización es una técnica de servidor de alto rendimiento.

Además, el modelo basado en eventos es menos eficaz que el modelo IAsyncResult porque crea más objetos, especialmente EventArgs, y debido a que se sincroniza entre subprocesos.

En la lista siguiente se indican algunas recomendaciones que deben seguirse si decide utilizar el modelo IAsyncResult:

  • Solo exponga el modelo IAsyncResult si necesita compatibilidad específica para los objetos WaitHandle o IAsyncResult.

  • Solo exponga el modelo IAsyncResult si tiene una API existente que usa el modelo IAsyncResult.

  • Si tiene una API existente basada en el modelo IAsyncResult, considere también la posibilidad de exponer el modelo basado en eventos en la próxima versión.

  • Solo exponga el modelo IAsyncResult si tiene requisitos de alto rendimiento que haya comprobado que no se pueden satisfacer con el modelo basado en eventos, pero sí con el modelo IAsyncResult.

Vea también