Información general sobre la programación asincrónica

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

AsyncState

Objeto específico opcional de aplicación que contiene información sobre la operación asincrónica.

AsyncWaitHandle

WaitHandle que se puede utilizar para bloquear la ejecución de la aplicación hasta que la operación asincrónica finaliza.

CompletedSynchronously

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.

IsCompleted

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.

BeginnombreDeOperació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.

NotaNota

Para cualquiera de los escenarios indefinidos, los implementadores deberían considerar la posibilidad de producir InvalidOperationException.

NotaNota

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:

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:

Vea también

Conceptos

Llamar a métodos sincrónicos de forma asincrónica

Utilizar un delegado AsyncCallback y un objeto State

Otros recursos

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