Articulo de referencia

Invocación de método asíncrono

En la programación multihilo , la invocación de métodos asíncronos ( AMI ), también conocida como llamadas a métodos asíncronos o patrón asíncrono , es un patrón de diseño en el...

En la programación multihilo , la invocación de métodos asíncronos ( AMI ), también conocida como llamadas a métodos asíncronos o patrón asíncrono , es un patrón de diseño en el que el hilo que realiza la llamada no se bloquea mientras espera a que finalice el código llamado. En cambio, el hilo que realiza la llamada recibe una notificación cuando llega la respuesta. Sondear el estado para obtener una respuesta es una opción indeseable.

Fondo

AMI es un patrón de diseño para la invocación asíncrona de métodos potencialmente de larga duración de un objeto . [ 1 ] Es equivalente al patrón IOU ("Te debo") descrito en 1996 por Allan Vermeulen. [ 2 ] [ 3 ]

En la mayoría de los lenguajes de programación, un método llamado se ejecuta de forma síncrona, es decir, en el hilo de ejecución desde el que se invoca. Si el método tarda mucho en completarse, por ejemplo, porque está cargando datos a través de internet, el hilo que lo llama se bloquea hasta que finaliza. Si esto no es deseable, es posible iniciar un hilo de trabajo e invocar el método desde allí. En la mayoría de los entornos de programación, esto requiere muchas líneas de código, especialmente si se tiene cuidado de evitar la sobrecarga que puede causar la creación de muchos hilos. AMI resuelve este problema al ampliar un método de objeto potencialmente de larga duración ("síncrono") con una variante "asíncrona" que devuelve un valor inmediatamente, junto con métodos adicionales que facilitan la recepción de notificaciones de finalización o la espera de la finalización en un momento posterior.

Un uso común de AMI es en el patrón de diseño de objeto activo . Las alternativas son la invocación de métodos síncronos y los objetos futuros . [ 4 ] Un ejemplo de una aplicación que puede usar AMI es un navegador web que necesita mostrar una página web incluso antes de que se carguen todas las imágenes.

Dado que un método es un caso especial de procedimiento , la invocación de un método asíncrono es un caso especial de llamada a un procedimiento asíncrono .

Implementaciones

Clase Java

La clase FutureTask [ 5 ] en Java utiliza eventos para resolver el mismo problema. Este patrón es una variante de AMI cuya implementación conlleva una mayor sobrecarga, pero es útil para objetos que representan componentes de software .

Marco de trabajo .NET

  • Patrón de modelo de programación asíncrona (APM) (utilizado antes de .NET Framework 2.0) [ 6 ]
  • Patrón asíncrono basado en eventos (EAP) (utilizado en .NET Framework 2.0) [ 7 ]
  • Patrón asíncrono basado en tareas (TAP) (utilizado en .NET Framework 4.0) [ 8 ]

Ejemplo

El siguiente ejemplo se basa libremente en un estilo AMI estándar utilizado en .NET Framework . [ 9 ] Dado un método Accomplish, se agregan dos nuevos métodos BeginAccomplishy EndAccomplish:

clase Ejemplo { Resultado Lograr ( args ) IAsyncResult IniciarLograr ( args ) Resultado FinLograr ( IAsyncResult a ) }

Al llamar a BeginAccomplish, el cliente recibe inmediatamente un objeto de tipo AsyncResult(que implementa la IAsyncResultinterfaz), por lo que puede continuar el hilo de llamada con trabajo no relacionado. En el caso más simple, eventualmente no hay más trabajo de ese tipo, y el cliente llama a EndAccomplish(pasando el objeto recibido previamente), que se bloquea hasta que el método haya finalizado y el resultado esté disponible. [ 10 ] El AsyncResultobjeto normalmente proporciona al menos un método que permite al cliente consultar si el método de larga duración ya ha finalizado:

interfaz IAsyncResult { bool HasCompleted () }

También se puede pasar un método de devolución de llamada BeginAccomplish, que se invocará cuando finalice el método de larga duración. Normalmente, este método llama EndAccomplisha para obtener el valor de retorno del método de larga duración. Un problema con el mecanismo de devolución de llamada es que la función de devolución de llamada se ejecuta naturalmente en el hilo de trabajo (en lugar de en el hilo que la llamó originalmente), lo que puede causar condiciones de carrera. [ 11 ] [ 12 ]

En la documentación de .NET Framework, el término patrón asíncrono basado en eventos se refiere a un estilo de API alternativo (disponible desde .NET 2.0) que utiliza un método llamado AccomplishAsyncen lugar de BeginAccomplish. [ 13 ] [ 14 ] Una diferencia superficial es que en este estilo el valor de retorno del método de larga duración se pasa directamente al método de devolución de llamada. Mucho más importante es que la API utiliza un mecanismo especial para ejecutar el método de devolución de llamada (que reside en un objeto de evento de tipo AccomplishCompleted) en el mismo hilo en el que BeginAccomplishse llamó. Esto elimina el peligro de condiciones de carrera, lo que hace que la API sea más fácil de usar y adecuada para componentes de software; por otro lado, esta implementación del patrón conlleva una sobrecarga adicional de creación de objetos y sincronización. [ 15 ]

Referencias

  1. "Invocación de método asíncrono" . Programación distribuida con Ice . ZeroC, Inc. Archivado del original el 5 de enero de 2008. Consultado el 22 de noviembre de 2008 .
  2. ^ Vermeulen, Allan (junio de 1996). "Un patrón de diseño asincrónico" . Diario del Dr. Dobb . Consultado el 22 de noviembre de 2008 .
  3. Nash, Trey (2007). "Hilo en C#". Accelerated C# 2008. Apress. ISBN 978-1-59059-873-3.
  4. Lavender, R. Greg; Douglas C. Schmidt . "Active Object" (PDF) . Archivado del original (PDF) el 22 de julio de 2012. Consultado el 22 de noviembre de 2008 .{{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  5. "Clase FutureTask" . Oracle. 2011. Archivado del original el 25 de junio de 2013. Consultado el 29 de junio de 2015 .
  6. "Modelo de programación asíncrona" . Microsoft. 2015. Consultado el 29 de junio de 2015 .
  7. "Descripción general del patrón asíncrono basado en eventos" . Microsoft. 2015. Consultado el 29 de junio de 2015 .
  8. "Patrón asíncrono basado en tareas" . Microsoft. 2015. Consultado el 29 de junio de 2015 .
  9. "Patrones de diseño de programación asíncrona" . Guía del desarrollador de .NET Framework . Microsoft Developer Network. Archivado del original el 22 de noviembre de 2008. Consultado el 22 de noviembre de 2008 .
  10. "Introducción a la programación asíncrona" . Guía del desarrollador de .NET Framework . Microsoft Developer Network. Archivado del original el 7 de diciembre de 2008. Consultado el 22 de noviembre de 2008 .
  11. "Uso de un delegado AsyncCallback para finalizar una operación asíncrona" . Guía del desarrollador de .NET Framework . Microsoft Developer Network. Archivado del original el 23 de diciembre de 2008. Consultado el 22 de noviembre de 2008 .
  12. "Problemas de concurrencia" . Programación distribuida con Ice . ZeroC, Inc. Archivado del original el 28 de marzo de 2008. Consultado el 22 de noviembre de 2008 .
  13. Christian Nagel; Bill Evjen; Jay Glynn; Karli Watson y Morgan Skinner (2008). «Patrón asíncrono basado en eventos». Professional C# 2008. Wiley. págs. 570-571 . ISBN  9780470191378.
  14. "Programación multihilo con el patrón asíncrono basado en eventos" . Guía del desarrollador de .NET Framework . Microsoft Developer Network. Archivado del original el 25 de diciembre de 2008. Consultado el 22 de noviembre de 2008 .
  15. "Decidir cuándo implementar el patrón asíncrono basado en eventos" . Guía del desarrollador de .NET Framework . Microsoft Developer Network. Archivado del original el 22 de noviembre de 2008. Consultado el 22 de noviembre de 2008 .

Lecturas adicionales

  • Chris Sells e Ian Griffiths (2007). «Apéndice C.3: El patrón asíncrono basado en eventos». Programación WPF . O'Reilly. págs. 747-749 . ISBN  9780596510374.
  • Uso de llamadas a métodos asíncronos en C#