Información general sobre la programación asincrónica
Actualización: noviembre 2007
Una operación asincrónica que utiliza el modelo de diseño IAsyncResult se implementa como dos métodos denominados BeginnombreDeOperación y EndnombreDeOperación que empiezan y terminan respectivamente la operación asincrónica nombreDeOperación. Por ejemplo, la clase FileStream proporciona los métodos BeginRead y EndRead para leer de forma asincrónica bytes de un archivo. Estos métodos implementan la versión asincrónica del método Read.
Después de llamar a BeginnombreDeOperación, una aplicación puede seguir ejecutando instrucciones en el subproceso que realiza la llamada mientras la operación asincrónica se lleva a cabo en un subproceso diferente. Para cada llamada a BeginnombreDeOperación, la aplicación también debería llamar a EndnombreDeOperación para obtener los resultados de la operación.
Comenzar una operación asincrónica
El método BeginnombreDeOperación inicia la operación asincrónica nombreDeOperación y devuelve un objeto que implementa la interfaz IAsyncResult. Los objetos IAsyncResult almacenan información sobre una operación asincrónica. En la siguiente tabla se muestra información sobre una operación asincrónica.
Miembro |
Descripción |
---|---|
Objeto específico opcional de aplicación que contiene información sobre la operación asincrónica. |
|
WaitHandle que se puede utilizar para bloquear la ejecución de la aplicación hasta que la operación asincrónica finaliza. |
|
Valor que indica si la operación asincrónica se completó en el subproceso utilizado para llamar a BeginnombreDeOperación en lugar de completarse en un subproceso ThreadPool independiente. |
|
Valor que indica si la operación asincrónica ha finalizado. |
Un método BeginnombreDeOperación toma todos los parámetros declarados en la firma de la versión sincrónica del método que se pasen por valor o por referencia. Los parámetros out no forman parte de la firma del método BeginnombreDeOperación. La firma del método BeginnombreDeOperación también incluye dos parámetros adicionales. El primero define un delegado AsyncCallback que hace referencia a un método al que se llama cuando finaliza la operación asincrónica. El llamador puede especificar null (Nothing en Visual Basic) si no desea que se invoque un método cuando la operación finaliza. El segundo parámetro adicional es un objeto definido por el usuario. Este objeto se puede utilizar para pasar información de estado específica de la aplicación al método invocado cuando la operación asincrónica finaliza. Si un método BeginnombreDeOperación toma parámetros adicionales específicos de operación, como una matriz de bytes para almacenar bytes leídos de un archivo, el objeto de estado de aplicación y AsyncCallback son los últimos parámetros de la firma del método BeginnombreDeOperación.
De principioNombreOperación devuelve inmediatamente el control al subproceso que realiza la llamada. Si el método BeginnombreDeOperación produce excepciones, será antes de que se inicie la operación asincrónica. Si el método BeginnombreDeOperación provoca excepciones, no se invoca el método de devolución de llamada.
Finalizar una operación asincrónica
El método EndnombreDeOperación finaliza la operación asincrónica nombreDeOperación. El tipo del valor devuelto del método EndnombreDeOperación coincide con el devuelto por su homólogo sincrónico y es específico de la operación asincrónica. Por ejemplo, el método EndRead devuelve el número de bytes leídos de FileStream y el método EndGetHostByName devuelve un objeto IPHostEntry que contiene información acerca de un equipo host. El método EndnombreDeOperación toma cualquier parámetro out o ref declarado en la firma de la versión sincrónica del método. Además de los parámetros del método sincrónico, el método EndnombreDeOperación también incluye un parámetro IAsyncResult. Los llamadores deben pasar la instancia devuelta por la llamada correspondiente a BeginnombreDeOperación.
Si la operación asincrónica representada por el objeto IAsyncResult no se ha completado cuando se llama a EndnombreDeOperación, EndnombreDeOperación bloquea el subproceso que realiza la llamada hasta que se completa la operación asincrónica. Las excepciones generadas por la operación asincrónica se producen desde el método EndnombreDeOperación. No se ha definido el efecto de llamar varias veces al método EndnombreDeOperación con el mismo objeto IAsyncResult. Tampoco se ha definido la llamada al método EndnombreDeOperación con un objeto IAsyncResult que no fue devuelto por el método Begin relacionado.
Nota: |
---|
Para cualquiera de los escenarios indefinidos, los implementadores deberían considerar la posibilidad de producir InvalidOperationException. |
Nota: |
---|
Los implementadores de este modelo de diseño deben avisar al llamador de que la operación sincrónica ha finalizado estableciendo IsCompleted en True, llamando al método de devolución de llamada asincrónico (si se ha especificado) y señalizando el objeto AsyncWaitHandle. |
Los desarrolladores de aplicaciones disponen de varias opciones de diseño para obtener acceso a los resultados de la operación asincrónica. La opción correcta depende de si la aplicación tiene instrucciones que se pueden ejecutar mientras la operación finaliza. Si una aplicación no puede realizar ningún otro trabajo hasta que reciba los resultados de la operación asincrónica, debe bloquearse hasta que los resultados estén disponibles. Para establecer el bloqueo hasta que finalice una operación asincrónica, puede recurrir a uno de los métodos siguientes:
Llamar a EndnombreDeOperación desde el subproceso principal de la aplicación, lo que supone bloquear la ejecución de la aplicación hasta que la operación se complete. Para ver un ejemplo en el que se ilustra esta técnica, vea Bloquear la ejecución de una aplicación al finalizar una operación asincrónica.
Utilice el objeto AsyncWaitHandle para bloquear la ejecución de la aplicación hasta que una o más operaciones hayan finalizado. Para ver un ejemplo en el que se ilustra esta técnica, vea Bloquear la ejecución de una aplicación mediante AsyncWaitHandle.
En el caso de las aplicaciones que no necesariamente deben bloquearse mientras la operación asincrónica finaliza, puede recurrir a uno de los métodos siguientes:
Sondear el estado de ejecución de la operación mediante la comprobación periódica de la propiedad IsCompleted y la realización de una llamada a EndnombreDeOperación cuando se complete la operación. Para ver un ejemplo en el que se ilustra esta técnica, vea Sondear el estado de una operación asincrónica.
Utilice un delegado AsyncCallback para especificar que se invoque un método cuando finalice la operación. Para ver un ejemplo en el que se ilustra esta técnica, consulte Utilizar un delegado AsyncCallback para finalizar una operación asincrónica.
Vea también
Conceptos
Llamar a métodos sincrónicos de forma asincrónica
Utilizar un delegado AsyncCallback y un objeto State