Async (Visual Basic)Async (Visual Basic)

El modificador Async indica que el método o la expresión lambda que modifica es asincrónico.The Async modifier indicates that the method or lambda expression that it modifies is asynchronous. Estos métodos se conocen como métodos asincrónicos.Such methods are referred to as async methods.

Un método asincrónico proporciona una manera cómoda de hacer el trabajo de larga duración sin bloquear el subproceso del llamador.An async method provides a convenient way to do potentially long-running work without blocking the caller's thread. El llamador de un método asincrónico puede reanudar el trabajo sin esperar a que el método asincrónico finalice.The caller of an async method can resume its work without waiting for the async method to finish.

Nota

Las palabras clave Async y Await se incluyeron en Visual Studio 2012.The Async and Await keywords were introduced in Visual Studio 2012. Para obtener una introducción a la programación asincrónica, vea programación asincrónica con Async y Await.For an introduction to async programming, see Asynchronous Programming with Async and Await.

En el siguiente ejemplo se muestra la estructura de un método asincrónico.The following example shows the structure of an async method. Por convención, los nombres de método asincrónico acaban en “Async”.By convention, async method names end in "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 Async contiene al menos una expresión o instrucción Await .Typically, a method modified by the Async keyword contains at least one Await expression or statement. El método se ejecuta sincrónicamente hasta alcanzar el primer Await, punto en el que se suspende hasta que la tarea en espera se complete.The method runs synchronously until it reaches the first Await, at which point it suspends until the awaited task completes. Mientras tanto, se devuelve el control al llamador del método asincrónico.In the meantime, control is returned to the caller of the method. Si el método no contiene una expresión o instrucción Await, el método no se suspende y se ejecuta como un método sincrónico.If the method doesn’t contain an Await expression or statement, the method isn’t suspended and executes as a synchronous method does. Una advertencia del compilador alerta de cualquier método asincrónico que no contenga Await, porque esa situación podría indicar un error.A compiler warning alerts you to any async methods that don't contain Await because that situation might indicate an error. Para obtener más información, vea el error del compilador.For more information, see the compiler error.

La palabra clave Async no está reservada.The Async keyword is an unreserved keyword. Es una palabra clave cuando modifica un método o una expresión lambda.It is a keyword when it modifies a method or a lambda expression. En todos los demás contextos, se interpreta como identificador.In all other contexts, it is interpreted as an identifier.

Tipos de valor devueltosReturn Types

Un método asincrónico es un procedimiento Sub o un procedimiento de función que tiene un tipo de valor devuelto de Task o Task<TResult>.An async method is either a Sub procedure, or a Function procedure that has a return type of Task or Task<TResult>. El método no puede declarar ningún parámetro ByRef .The method cannot declare any ByRef parameters.

Especifique Task(Of TResult) para el tipo de valor devuelto de un método asincrónico si la instrucción Return del método tiene un operando de tipo TResult.You specify Task(Of TResult) for the return type of an async method if the Return statement of the method has an operand of type TResult. Utilice Task si no se devuelve ningún valor significativo al completarse el método.You use Task if no meaningful value is returned when the method is completed. Es decir, una llamada al método devuelve Task, pero cuando se completa Task, ninguna instrucción Await que está en espera de Task no genera un valor de resultado.That is, a call to the method returns a Task, but when the Task is completed, any Await statement that's awaiting the Task doesn’t produce a result value.

Las subrutinas asincrónicas se utilizan principalmente para definir controladores de eventos donde se requiere un procedimiento Sub.Async subroutines are used primarily to define event handlers where a Sub procedure is required. El llamador de una subrutina asincrónica no puede esperar a que finalice y no puede detectar las excepciones que el método inicia.The caller of an async subroutine can't await it and can't catch exceptions that the method throws.

Para más información y ejemplos, vea Tipos de valor devueltos asincrónicos.For more information and examples, see Async Return Types.

EjemploExample

Los ejemplos siguientes muestran un controlador de eventos asincrónicos, una expresión lambda asincrónica y un método asincrónico.The following examples show an async event handler, an async lambda expression, and an async method. Para obtener un ejemplo completo en el que se usan estos elementos, vea Tutorial: acceso a la web mediante Async y Await.For a full example that uses these elements, see Walkthrough: Accessing the Web by Using Async and Await. Puede descargar el código del tutorial en Ejemplos de código para desarrolladores.You can download the walkthrough code from Developer Code Samples.

' 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énSee also