Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
Llama a
EndOperationName
desde el subproceso principal de la aplicación, bloqueando la ejecución de la aplicación hasta que se complete la operación. Para obtener un ejemplo que ilustra esta técnica, vea Bloquear la ejecución de la aplicación finalizando una operación asincrónica.Usa el AsyncWaitHandle para bloquear la ejecución de la aplicación hasta que se completen una o varias operaciones. Para obtener un ejemplo que ilustra esta técnica, vea Bloquear la ejecución de la aplicación mediante AsyncWaitHandle.
Las aplicaciones que no necesitan bloquear mientras se completa la operación asincrónica pueden usar uno de los métodos siguientes:
Sondee el estado de finalización de la operación comprobando la IsCompleted propiedad periódicamente y llamando
EndOperationName
cuando se complete la operación. Para obtener un ejemplo que ilustra esta técnica, vea Sondear el estado de una operación asincrónica.Use un AsyncCallback delegado para especificar un método que se va a invocar cuando se complete la operación. Para obtener un ejemplo que ilustra esta técnica, vea Usar un delegado AsyncCallback para finalizar una operación asincrónica.