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.
El operador se aplica Await a un operando en un método asincrónico o expresión lambda para suspender la ejecución del método hasta que se complete la tarea esperada. La tarea representa el trabajo en curso.
El método en el que Await se usa debe tener un modificador asincrónico . Este método, definido mediante el Async modificador y normalmente que contiene una o varias Await expresiones, se conoce como método asincrónico.
Nota:
Las Async palabras clave y Await se introdujeron en Visual Studio 2012. Para obtener una introducción a la programación asincrónica, consulte Programación asincrónica con Async y Await.
Normalmente, la tarea a la que se aplica el Await operador es el valor devuelto de una llamada a un método que implementa el patrón asincrónico deTask-Based, es decir, o Task .Task<TResult>
En el código siguiente, el HttpClient método GetByteArrayAsync devuelve getContentsTask, un Task(Of Byte()). La tarea es una promesa de generar la matriz de bytes real cuando se completa la operación. El Await operador se aplica a para getContentsTask suspender la ejecución en SumPageSizesAsync hasta getContentsTask que se complete. Mientras tanto, el control se devuelve al autor de la llamada de SumPageSizesAsync. Cuando getContentsTask termine, la Await expresión se evalúa como una matriz de bytes.
Private Async Function SumPageSizesAsync() As Task
' To use the HttpClient type in desktop apps, you must include a using directive and add a
' reference for the System.Net.Http namespace.
Dim client As HttpClient = New HttpClient()
' . . .
Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
Dim urlContents As Byte() = Await getContentsTask
' Equivalently, now that you see how it works, you can write the same thing in a single line.
'Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
' . . .
End Function
Importante
Para obtener el ejemplo completo, vea Tutorial: Acceso a la web mediante Async y Await. Puede descargar el ejemplo desde el explorador de ejemplo de .NET. El código de ejemplo está en el proyecto SerialAsyncExample.
Si Await se aplica al resultado de una llamada de método que devuelve un Task(Of TResult), el tipo de la Await expresión es TResult. Si Await se aplica al resultado de una llamada de método que devuelve , Taskla Await expresión no devuelve un valor . En el siguiente ejemplo se ilustra la diferencia.
' Await used with a method that returns a Task(Of TResult).
Dim result As TResult = Await AsyncMethodThatReturnsTaskTResult()
' Await used with a method that returns a Task.
Await AsyncMethodThatReturnsTask()
Una Await expresión o instrucción no bloquea el subproceso en el que se está ejecutando. En su lugar, hace que el compilador registre el resto del método asincrónico, después de la Await expresión, como una continuación en la tarea esperada. A continuación, el control vuelve al autor de la llamada del método asincrónico. Cuando se completa la tarea, invoca su continuación y la ejecución del método asincrónico se reanuda donde se dejó.
Una Await expresión solo se puede producir en el cuerpo de un método envolvente inmediatamente o una expresión lambda marcada por un Async modificador. El término Await actúa como palabra clave solo en ese contexto. En otro lugar, se interpreta como un identificador. Dentro del Async método o expresión lambda, una Await expresión no se puede producir en una expresión de consulta, en el Catch bloque o Finally de un try... Atrapar... Por último, en la expresión de variable de control de bucle de un For bucle o For Each , o en el cuerpo de una instrucción SyncLock .
Excepciones
La mayoría de los métodos asincrónicos devuelven o TaskTask<TResult>. Las propiedades de la tarea devuelta llevan información sobre su estado e historial, como si la tarea está completa, si el método asincrónico provocó una excepción o se canceló, y cuál es el resultado final. El Await operador accede a esas propiedades.
Si espera un método asincrónico que devuelve tareas que provoca una excepción, el Await operador vuelve a iniciar la excepción.
Si espera un método asincrónico que devuelve tareas que se cancela, el Await operador vuelve a generar un OperationCanceledException.
Una sola tarea que se encuentra en un estado defectuoso puede reflejar varias excepciones. Por ejemplo, la tarea podría ser el resultado de una llamada a Task.WhenAll. Cuando se espera esta tarea, la operación await vuelve a iniciar una de las excepciones. Sin embargo, no se puede predecir cuál de las excepciones se vuelve a iniciar.
Para obtener ejemplos de control de errores en métodos asincrónicos, consulte Try... Atrapar... Finally (Instrucción).
Ejemplo
En el ejemplo siguiente de Windows Forms se muestra el uso de Await en un método asincrónico, WaitAsynchronouslyAsync. Contraste el comportamiento de ese método con el comportamiento de WaitSynchronously. Sin un Await operador, WaitSynchronously se ejecuta sincrónicamente a pesar del uso del Async modificador en su definición y una llamada a Thread.Sleep en su cuerpo.
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' Call the method that runs asynchronously.
Dim result As String = Await WaitAsynchronouslyAsync()
' Call the method that runs synchronously.
'Dim result As String = Await WaitSynchronously()
' Display the result.
TextBox1.Text &= result
End Sub
' The following method runs asynchronously. The UI thread is not
' blocked during the delay. You can move or resize the Form1 window
' while Task.Delay is running.
Public Async Function WaitAsynchronouslyAsync() As Task(Of String)
Await Task.Delay(10000)
Return "Finished"
End Function
' The following method runs synchronously, despite the use of Async.
' You cannot move or resize the Form1 window while Thread.Sleep
' is running because the UI thread is blocked.
Public Async Function WaitSynchronously() As Task(Of String)
' Import System.Threading for the Sleep method.
Thread.Sleep(10000)
Return "Finished"
End Function