Compartir a través de


Modelo de programación asincrónica (APM)

Una operación asincrónica que usa el IAsyncResult patrón de diseño se implementa como dos métodos denominados BeginOperationName y EndOperationName que comienzan y terminan la operación asincrónica OperationName respectivamente. Por ejemplo, la FileStream clase proporciona los BeginRead métodos y EndRead para leer de forma asincrónica bytes de un archivo. Estos métodos implementan la versión asincrónica del Read método .

Nota:

A partir de .NET Framework 4, la biblioteca paralela de tareas proporciona un nuevo modelo para la programación asincrónica y paralela. Para obtener más información, vea Biblioteca paralela de tareas (TPL) y Patrón asincrónico basado en tareas (TAP)).

Después de llamar a BeginOperationName, una aplicación puede seguir ejecutando instrucciones en el subproceso que realiza la llamada mientras la operación asincrónica tiene lugar en otro subproceso. Para cada llamada a BeginOperationName, la aplicación también debe llamar EndOperationName a para obtener los resultados de la operación.

Inicio de una operación asincrónica

El BeginOperationName método comienza la operación asincrónica OperationName y devuelve un objeto que implementa la IAsyncResult interfaz . IAsyncResult los objetos almacenan información sobre una operación asincrónica. En la tabla siguiente se muestra información sobre una operación asincrónica.

Miembro Descripción
AsyncState Objeto opcional específico de la aplicación que contiene información sobre la operación asincrónica.
AsyncWaitHandle WaitHandle que se puede usar para bloquear la ejecución de la aplicación hasta que se complete la operación asincrónica.
CompletedSynchronously Valor que indica si la operación asincrónica se completó en el subproceso utilizado para realizar la llamada BeginOperationName, en lugar de completarse en un subproceso independiente ThreadPool.
IsCompleted Valor que indica si se ha completado la operación asincrónica.

Un método BeginOperationName toma los parámetros declarados en la firma de la versión sincrónica del método que se pasan por valor o por referencia. Los parámetros out no forman parte de la firma del método BeginOperationName. La firma del BeginOperationName método también incluye dos parámetros adicionales. La primera de estas define un AsyncCallback delegado que hace referencia a un método al que se llama cuando se completa la operación asincrónica. El autor de la llamada puede especificar null (Nothing en Visual Basic) si no quiere que se invoque un método cuando se complete la operación. El segundo parámetro adicional es un objeto definido por el usuario. Este objeto se puede usar para pasar información de estado específica de la aplicación al método invocado cuando se completa la operación asincrónica. Si un método BeginOperationName toma parámetros específicos de operación adicionales, como una matriz de bytes para almacenar los bytes leídos de un archivo, el delegado AsyncCallback y el objeto de estado de la aplicación son los últimos parámetros de la firma del método BeginOperationName.

BeginOperationName devuelve el control inmediatamente al subproceso de llamada. Si el BeginOperationName método produce excepciones, las excepciones se inician antes de que se inicie la operación asincrónica. Si el BeginOperationName método produce excepciones, no se llama al método de retorno.

Finalizar una operación asincrónica

El EndOperationName método finaliza la operación asincrónica OperationName. El valor devuelto del EndOperationName método es el mismo tipo devuelto por su homólogo sincrónico y es específico de la operación asincrónica. Por ejemplo, el EndRead método devuelve el número de bytes leídos de y FileStream el EndGetHostByName método devuelve un IPHostEntry objeto que contiene información sobre un equipo host. El método EndOperationName toma los parámetros 'out' o 'ref' que se declaran en la firma de la versión sincrónica de este método. Además de los parámetros del método sincrónico, el EndOperationName método también incluye un IAsyncResult parámetro . Los autores de la llamada deben pasar la instancia devuelta por la llamada correspondiente a BeginOperationName.

Si la operación asincrónica representada por el objeto IAsyncResult no se ha completado cuando se llama a EndOperationName, EndOperationName bloquea el hilo de ejecución hasta que la operación asincrónica se complete. Las excepciones generadas por la operación asincrónica se generan desde el método EndOperationName. El efecto de llamar al EndOperationName método varias veces con el mismo IAsyncResult no se define. Del mismo modo, tampoco se ha definido la llamada al método EndOperationName con una interfaz IAsyncResult no devuelta por el método Begin relacionado.

Nota:

En cualquiera de los escenarios no definidos, los implementadores deben considerar lanzar InvalidOperationException.

Nota:

Los implementadores de este patrón de diseño deben notificar al llamador que la operación asincrónica se completó estableciendo IsCompleted en true, llamando al método de devolución de llamada asincrónico (si se especificó uno) y señalizando el AsyncWaitHandle.

Los desarrolladores de aplicaciones tienen varias opciones de diseño para acceder 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 se completa la operación. Si una aplicación no puede realizar ningún trabajo adicional hasta que reciba los resultados de la operación asincrónica, la aplicación debe bloquearse hasta que los resultados estén disponibles. Para bloquear hasta que se complete una operación asincrónica, puede usar uno de los métodos siguientes:

Las aplicaciones que no necesitan bloquear mientras se completa la operación asincrónica pueden usar uno de los métodos siguientes:

Consulte también