Compartir a través de


Await (Operador) (Visual Basic)

Se aplica el operador de Await un operando de un método asincrónico o la expresión lambda para suspender la ejecución del método hasta que la tarea aguardada complete.La tarea representa el trabajo en curso.

El método en el que se utiliza Await debe tener un modificador de Async.Este método, definido mediante el modificador de Async, y suele contener una o más expresiones de Await, se denomina método async.

[!NOTA]

Las palabras clave de Async y de Await se introdujeron en Visual Studio 2012.Para obtener información sobre las nuevas características de esa versión, vea Novedades de Visual Studio 2012.

Para obtener una introducción a la programación async, vea Programación asincrónica con Async y Await (C# y Visual Basic).

Normalmente, se aplica la tarea que el operador de Await es el valor devuelto por una llamada a un método que implemente Modelo asincrónico basado Tarea-, es decir, Task o Task<TResult>.

En el código siguiente, el método GetByteArrayAsync de HttpClient devuelve getContentsTask, Task(Of Byte()).La tarea es una sugerencia para generar la matriz de bytes real cuando se completa la operación.Se aplican al operador de Await a getContentsTask para suspender la ejecución en SumPageSizesAsync hasta que se complete getContentsTask.Mientras tanto, el control se devuelve al llamador de SumPageSizesAsync.Cuando finaliza getContentsTask, la expresión de Await 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
Nota importanteImportante

Para obtener el ejemplo completo, vea Walkthrough: Acceso a web usando Async y Await (C# y Visual Basic).Puede descargar el ejemplo Ejemplos de código del desarrollador en el sitio Web de Microsoft.El ejemplo está en el proyecto de AsyncWalkthrough_HttpClient.

Si Await se aplica al resultado de una llamada al método que devuelve Task(Of TResult), el tipo de expresión de Await es TResult.Si Await se aplica al resultado de una llamada al método que devuelve Task, la expresión de Await no devuelve un valor.El ejemplo siguiente muestra 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 expresión o instrucción de Await no bloquea el subproceso en el que se ejecuta.En su lugar, el compilador hace para inscribirse el resto del método async, después de la expresión de Await, como una continuación en la tarea aguardada.El Control se devuelve al llamador del método async.Cuando la tarea se completa, invoca su continuación, y la ejecución del método async reanuda donde se quedó.

Una expresión de Await sólo puede aparecer en el cuerpo de un método o una expresión lambda inmediatamente envolvente que esté marcada por un modificador de Async.El término Await actúa como palabra clave solo en ese contexto.En otra parte, se interpreta como un identificador.Dentro del método async o expresión lambda, una expresión de Await no puede aparecer en una expresión de consulta, en el bloque de catch o de finally de una instrucción de Try… Catch… Finally, en la expresión variable de control de bucle de un bucle de For o de For Each, o en el cuerpo de una instrucción de SyncLock.

Excepciones

La mayoría de los métodos async devuelven Task o Task<TResult>.Las propiedades de la tarea devuelta contienen información sobre su estado e historial, por ejemplo si la tarea se ha completado, si el método async produjo una excepción o se cancela, y cuáles el resultado final es.El operador de Await tiene acceso a esas propiedades.

Si se espera un método async tarea- que cambia que produce una excepción, los vuelve de operador de Await la excepción.

Si se espera un método async tarea- que cambia que se cancele, los vuelve de operador de AwaitOperationCanceledException.

Una única tarea que se con errores puede reflejar varias excepciones.Por ejemplo, la tarea puede ser el resultado de una llamada a Task.WhenAll.Cuando se espera por tarea, los vuelve sólo uno de la operación de aguardar de excepciones.Sin embargo, no puede predecir cuáles de las excepciones son reiniciarse.

Para obtener ejemplos de control de errores en métodos async, vea Instrucción Try...Catch...Finally (Visual Basic).

Ejemplo

El ejemplo siguiente de formularios Windows Forms muestra el uso de Await en un método async, WaitAsynchronouslyAsync.Compare el comportamiento de ese método con el comportamiento de WaitSynchronously.Sin un operador de Await, WaitSynchronously ejecuta sincrónicamente a pesar de uso del modificador de Async 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

Vea también

Tareas

Walkthrough: Acceso a web usando Async y Await (C# y Visual Basic)

Referencia

Async (Visual Basic)

Conceptos

Programación asincrónica con Async y Await (C# y Visual Basic)