Compartir a través de


Async (Visual Basic)

El modificador de Async indica que el método o expresión lambda que modifica es asincrónico.Tales métodos se conocen como métodos async.

Un método async proporciona una manera cómoda de hacer el trabajo de larga duración sin bloquear el subproceso del llamador.El llamador de un método async puede reanudar el trabajo sin esperar a que el método async finalice.

[!NOTA]

Las palabras clave de Async y de Await se introdujeron en Visual Studio 2012.Para obtener información sobre otras nuevas características en 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).

El ejemplo siguiente se muestra la estructura de un método async.Por convención, los nombres de método async acaban en “Async”.

Public Async Function ExampleMethodAsync() As Task(Of Integer)
    ' . . .

    ' At the Await expression, execution in this method is suspended and,
    ' if AwaitedProcessAsync has not already finished, control returns
    ' to the caller of ExampleMethodAsync. When the awaited task is 
    ' completed, this method resumes execution. 
    Dim exampleInt As Integer = Await AwaitedProcessAsync()

    ' . . .

    ' The return statement completes the task. Any method that is 
    ' awaiting ExampleMethodAsync can now get the integer result.
    Return exampleInt
End Function

Normalmente, un método modificado por la palabra clave de Async contiene al menos una expresión o instrucción de Espera.El método se ejecuta sincrónicamente hasta alcanzar primer Await, en las que el punto se suspende hasta que la tarea aguardada complete.Mientras tanto, el control se devuelve al llamador del método.Si el método no contiene una expresión o instrucción de Await, el método no se suspende y no se ejecuta como ocurre un método sincrónico.Una advertencia del compilador alerta a cualquier método async que no contiene Await porque esa situación podría indicar un error.Para obtener más información, vea error del compilador.

La palabra clave de Async es una palabra clave no reservadas.Es una palabra clave cuando modifica un método o una expresión lambda.En todos los demás contextos, se interpreta como un identificador.

Tipos de valor devueltos

Un método async es un procedimiento de Sub, o un procedimiento de Función que tiene un tipo de valor devuelto de Task o de Task<TResult>.El método no puede declarar los parámetros de ByRef.

Especifica Task(Of TResult) para el tipo de un método async si la instrucción de Return del método tiene un operando de tipo TResult.Utiliza Task si no se devuelve ningún valor significativo cuando se completa el método.Es decir, una llamada al método devuelve Task, pero cuando se completa Task, ninguna instrucción de Await que está esperando Task no genera un valor de resultado.

Las subrutinas Async se utilizan principalmente para definir controladores de eventos donde se requiere un procedimiento de Sub.El llamador de una subrutina async no puede aguardarla y no puede detectar las excepciones que el método produce.

Para obtener más información y ejemplos, vea Tipos de valor devuelto de Async (C y Visual Basic).

Ejemplo

Los ejemplos siguientes muestran un controlador de eventos async, una expresión lambda async, y un método async.Para obtener un ejemplo completo que usa estos elementos, vea Walkthrough: Acceso a web usando Async y Await (C# y Visual Basic).Puede descargar el código del Ejemplos de código del desarrollador tutorial de.

' An event handler must be a Sub procedure.
Async Sub button1_Click(sender As Object, e As RoutedEventArgs) Handles button1.Click
    textBox1.Clear()
    ' SumPageSizesAsync is a method that returns a Task.
    Await SumPageSizesAsync()
    textBox1.Text = vbCrLf & "Control returned to button1_Click."
End Sub


' The following async lambda expression creates an equivalent anonymous
' event handler.
AddHandler button1.Click, Async Sub(sender, e)
                              textBox1.Clear()
                              ' SumPageSizesAsync is a method that returns a Task.
                              Await SumPageSizesAsync()
                              textBox1.Text = vbCrLf & "Control returned to button1_Click."
                          End Sub 


' The following async method returns a Task(Of T).
' A typical call awaits the Byte array result:
'      Dim result As Byte() = Await GetURLContents("https://msdn.com")
Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())

    ' The downloaded resource ends up in the variable named content.
    Dim content = New MemoryStream()

    ' Initialize an HttpWebRequest for the current URL.
    Dim webReq = CType(WebRequest.Create(url), HttpWebRequest)

    ' Send the request to the Internet resource and wait for
    ' the response.
    Using response As WebResponse = Await webReq.GetResponseAsync()
        ' Get the data stream that is associated with the specified URL.
        Using responseStream As Stream = response.GetResponseStream()
            ' Read the bytes in responseStream and copy them to content.  
            ' CopyToAsync returns a Task, not a Task<T>.
            Await responseStream.CopyToAsync(content)
        End Using
    End Using

    ' Return the result as a byte array.
    Return content.ToArray()
End Function

Vea también

Tareas

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

Referencia

Await (Operador) (Visual Basic)

AsyncStateMachineAttribute

Conceptos

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