Modelo de programación asincrónica (APM)Asynchronous Programming Model (APM)

Una operación asincrónica que usa el modelo de diseño IAsyncResult se implementa como dos métodos con nombre BeginOperationName y EndOperationName que comienzan y terminan la operación asincrónica OperationName respectivamente.An asynchronous operation that uses the IAsyncResult design pattern is implemented as two methods named BeginOperationName and EndOperationName that begin and end the asynchronous operation OperationName respectively. Por ejemplo, la clase FileStream ofrece los métodos BeginRead y EndRead para leer bytes de un archivo de manera asincrónica.For example, the FileStream class provides the BeginRead and EndRead methods to asynchronously read bytes from a file. Estos métodos implementan la versión asincrónica del método Read .These methods implement the asynchronous version of the Read method.

Nota

A partir de .NET Framework 4, la biblioteca TPL (Task Parallel Library, biblioteca de procesamiento paralelo basado en tareas) ofrece un nuevo modelo para programación asincrónica y paralela.Starting with the .NET Framework 4, the Task Parallel Library provides a new model for asynchronous and parallel programming. Para obtener más información, vea Task Parallel Library (TPL) y Task-based Asynchronous Pattern (TAP).For more information, see Task Parallel Library (TPL) and Task-based Asynchronous Pattern (TAP)).

Después de llamar a BeginOperationName, una aplicación puede seguir ejecutando instrucciones en el subproceso de llamada mientras la operación asincrónica tiene lugar en un subproceso diferente.After calling BeginOperationName, an application can continue executing instructions on the calling thread while the asynchronous operation takes place on a different thread. Para cada llamada a BeginOperationName, la aplicación debe llamar a EndOperationName para obtener los resultados de la operación.For each call to BeginOperationName, the application should also call EndOperationName to get the results of the operation.

Comenzar una operación asincrónicaBeginning an Asynchronous Operation

El método BeginOperationName comienza la operación asincrónica OperationName y devuelve un objeto que implementa la interfaz IAsyncResult.The BeginOperationName method begins asynchronous operation OperationName and returns an object that implements the IAsyncResult interface. Los objetosIAsyncResult almacenan información sobre una operación asincrónica.IAsyncResult objects store information about an asynchronous operation. En la tabla siguiente se muestra información sobre una operación asincrónica.The following table shows information about an asynchronous operation.

MiembroMember DescripciónDescription
AsyncState Objeto opcional específico de la aplicación que contiene información sobre la operación asincrónica.An optional application-specific object that contains information about the asynchronous operation.
AsyncWaitHandle Un WaitHandle que se puede usar para bloquear la ejecución de la aplicación hasta que se complete la operación asincrónica.A WaitHandle that can be used to block application execution until the asynchronous operation completes.
CompletedSynchronously Un valor que indica si la operación asincrónica se completó en el subproceso usado para llamar a BeginOperationName en lugar de completarse en otro subproceso ThreadPool.A value that indicates whether the asynchronous operation completed on the thread used to call BeginOperationName instead of completing on a separate ThreadPool thread.
IsCompleted Un valor que indica si se ha completado la operación asincrónica.A value that indicates whether the asynchronous operation has completed.

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.A BeginOperationName method takes any parameters declared in the signature of the synchronous version of the method that are passed by value or by reference. Los parámetros out no forman parte de la firma del método BeginOperationName.Any out parameters are not part of the BeginOperationName method signature. La firma del método BeginOperationName también incluye dos parámetros adicionales.The BeginOperationName method signature also includes two additional parameters. El primero de estos define un delegado AsyncCallback que hace referencia a un método al que se llama cuando se completa la operación asincrónica.The first of these defines an AsyncCallback delegate that references a method that is called when the asynchronous operation completes. El llamador puede especificar null (Nothing en Visual Basic) si no quiere un método invocado cuando finalice la operación.The caller can specify null (Nothing in Visual Basic) if it does not want a method invoked when the operation completes. El segundo parámetro adicional es un objeto definido por el usuario.The second additional parameter is a user-defined object. Este objeto se puede usar para pasar información de estado específica de la aplicación al método invocado cuando finaliza la operación asincrónica.This object can be used to pass application-specific state information to the method invoked when the asynchronous operation completes. 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.If a BeginOperationName method takes additional operation-specific parameters, such as a byte array to store bytes read from a file, the AsyncCallback and application state object are the last parameters in the BeginOperationName method signature.

BeginOperationName devuelve el control inmediatamente al subproceso de llamada.BeginOperationName returns control to the calling thread immediately. Si el método BeginOperationName genera excepciones, las excepciones se generan antes de iniciarse la operación asincrónica.If the BeginOperationName method throws exceptions, the exceptions are thrown before the asynchronous operation is started. Si el método BeginOperationName genera excepciones, no se invoca el método de devolución de llamada.If the BeginOperationName method throws exceptions, the callback method is not invoked.

Finalizar una operación asincrónicaEnding an Asynchronous Operation

El método EndOperationName finaliza la operación asincrónica OperationName.The EndOperationName method ends asynchronous operation OperationName. El valor devuelto del método EndOperationName es del mismo tipo devuelto por su homólogo sincrónico y es específico de la operación asincrónica.The return value of the EndOperationName method is the same type returned by its synchronous counterpart and is specific to the asynchronous operation. Por ejemplo, el método EndRead devuelve el número de bytes leídos de un FileStream y el método EndGetHostByName devuelve un objeto IPHostEntry que contiene información sobre un equipo host.For example, the EndRead method returns the number of bytes read from a FileStream and the EndGetHostByName method returns an IPHostEntry object that contains information about a host computer. El método EndOperationName toma los parámetros out o ref declarados en la firma de la versión sincrónica del método.The EndOperationName method takes any out or ref parameters declared in the signature of the synchronous version of the method. Además de los parámetros del método sincrónico, el método EndOperationName también incluye un parámetro IAsyncResult.In addition to the parameters from the synchronous method, the EndOperationName method also includes an IAsyncResult parameter. Los autores de la llamada deben pasar la instancia devuelta por la llamada correspondiente a BeginOperationName.Callers must pass the instance returned by the corresponding call to BeginOperationName.

Si la operación asincrónica representada por el objeto IAsyncResult no ha finalizado cuando se llama a EndOperationName, EndOperationName bloquea el subproceso de llamada hasta que finaliza la operación asincrónica.If the asynchronous operation represented by the IAsyncResult object has not completed when EndOperationName is called, EndOperationName blocks the calling thread until the asynchronous operation is complete. Las excepciones generadas por la operación asincrónica se generan desde el método EndOperationName.Exceptions thrown by the asynchronous operation are thrown from the EndOperationName method. El efecto de llamar al método EndOperationName varias veces con el mismo IAsyncResult no está definido.The effect of calling the EndOperationName method multiple times with the same IAsyncResult is not defined. 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.Likewise, calling the EndOperationName method with an IAsyncResult that was not returned by the related Begin method is also not defined.

Nota

En cualquiera de los escenarios sin definir, los implementadores deben considerar generar InvalidOperationException.For either of the undefined scenarios, implementers should consider throwing InvalidOperationException.

Nota

Los implementadores de este patrón de diseño deben notificar al llamador que ha completado la operación asincrónica estableciendo IsCompleted en true, llamando al método de devolución de llamada asincrónica (si se especificó) y señalizando el AsyncWaitHandle.Implementers of this design pattern should notify the caller that the asynchronous operation completed by setting IsCompleted to true, calling the asynchronous callback method (if one was specified) and signaling the AsyncWaitHandle.

Los desarrolladores de aplicaciones tienen varias opciones de diseño para tener acceso a los resultados de la operación asincrónica.Application developers have several design choices for accessing the results of the asynchronous operation. La opción correcta depende de si la aplicación tiene instrucciones que se pueden ejecutar mientras se completa la operación.The correct choice depends on whether the application has instructions that can execute while the operation completes. Si una aplicación no puede realizar ningún trabajo adicional hasta que recibe los resultados de la operación asincrónica, debe bloquearse la aplicación hasta que los resultados estén disponibles.If an application cannot perform any additional work until it receives the results of the asynchronous operation, the application must block until the results are available. Para bloquear hasta que finalice una operación asincrónica, puede usar uno de los siguientes enfoques:To block until an asynchronous operation completes, you can use one of the following approaches:

Las aplicaciones que no necesiten bloquear mientras se completa la operación asincrónica pueden usar uno de los siguientes métodos:Applications that do not need to block while the asynchronous operation completes can use one of the following approaches:

Vea tambiénSee also