Compartir a través de


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

Actualización: noviembre 2007

El Modelo asincrónico basado en evento proporciona un modelo para exponer el comportamiento asincrónico de una clase. Con la introducción de este modelo, .NET Framework 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 tema se explica cuándo es adecuado implementar ambos modelos.

Para obtener más información sobre la programación asincrónica con la interfaz IAsyncResult, vea Modelos de diseño para la programación asincrónica.

Principios generales

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

Nota:

Es raro que se implemente el modelo IAsyncResult sin que también se implemente el modelo basado en eventos.

Instrucciones

La lista siguiente incluye instrucciones sobre cuándo se debería implementar el Modelo asincrónico basado en evento:

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

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

  • Exponga el modelo IAsyncResult sólo cuando sea necesario para cumplir 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 evento.

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

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

  • Evite exponer el modelo basado en eventos y el modelo IAsyncResult en la misma clase. Exponga el modelo basado en eventos en las clases de “alto nivel” y el modelo IAsyncResult en clases de “nivel inferior”. Por ejemplo, compare el modelo basado en eventos en el componente WebClient con el modelo IAsyncResult en 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 utiliza el modelo IAsyncResult, sería necesario conservar el modelo IAsyncResult para la 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 no compensará la ventaja de separar las implementaciones. Es mejor exponer ambos modelos en una sola clase que evitar exponer el modelo basado en evento.

    • Si debe exponer tanto el modelo basado en eventos como el modelo IAsyncResult en una única clase, utilice EditorBrowsableAttribute establecido en Advanced para marcar la implementación del modelo IAsyncResult como característica avanzada. Esto indica a los entornos de diseño, como el IntelliSense de Visual Studio, que no deben mostrar las propiedades y 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 evento tiene muchas ventajas en los escenarios mencionados anteriormente, tiene algunos inconvenientes que debería conocer si el factor más importante para sus aplicaciones es el rendimiento.

Hay tres escenarios que no prevé el modelo basado en eventos así como el modelo IAsyncResult:

Puede afrontar estos escenarios utilizando el modelo basado en eventos, pero hacerlo resulta más torpe que utilizar el modelo IAsyncResult.

A menudo, los desarrolladores utilizan el modelo IAsyncResult para los servicios que normalmente tienen requisitos de muy alto rendimiento. Por ejemplo, el escenario de sondeo 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, sobre todo EventArgs, y porque sincroniza los subprocesos.

La lista siguiente muestra algunas recomendaciones que seguir si decide utilizar el modelo IAsyncResult:

  • Exponga sólo el modelo IAsyncResult cuando requiere específicamente la compatibilidad para los objetos WaitHandle o IAsyncResult.

  • Exponga el modelo IAsyncResult sólo cuando tenga una API existente que utilice el modelo IAsyncResult.

  • Si tiene una API existente basada en el modelo IAsyncResult, plantéese exponer también el modelo basado en eventos en su siguiente versión publicada.

  • Exponga el modelo IAsyncResult sólo si requiere un rendimiento algo que haya comprobado que no puede obtener con el modelo basado en eventos pero que sí se puede conseguir con el modelo IAsyncResult.

Vea también

Tareas

Tutorial: Implementar un componente que admita el modelo asincrónico basado en eventos

Conceptos

Implementar el modelo asincrónico basado en eventos

Procedimientos recomendados para implementar el modelo asincrónico basado en eventos

Información general sobre el modelo asincrónico basado en eventos

Otros recursos

Modelos de diseño para la programación asincrónica

Programación multiproceso con el modelo asincrónico basado en eventos