Async (Visual Basic)Async (Visual Basic)

O Async modificador indica que o método ou a expressão lambda que ele modifica é assíncrono.The Async modifier indicates that the method or lambda expression that it modifies is asynchronous. Esses métodos são chamados de métodos assíncronos.Such methods are referred to as async methods.

Um método assíncrono fornece uma maneira conveniente de executar trabalhos potencialmente demorados sem bloquear o thread do chamador.An async method provides a convenient way to do potentially long-running work without blocking the caller's thread. O chamador de um método assíncrono pode retomar seu trabalho sem esperar que o método Async seja concluído.The caller of an async method can resume its work without waiting for the async method to finish.

Observação

As palavras-chave Async e Await foram introduzidas no Visual Studio 2012.The Async and Await keywords were introduced in Visual Studio 2012. Para obter uma introdução à programação assíncrona, consulte programação assíncrona com Async e Await.For an introduction to async programming, see Asynchronous Programming with Async and Await.

O exemplo a seguir mostra a estrutura de um método assíncrono.The following example shows the structure of an async method. Por convenção, os nomes de método assíncronos terminam em "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, um método modificado pela Async palavra-chave contém pelo menos uma expressão ou instrução Await .Typically, a method modified by the Async keyword contains at least one Await expression or statement. O método é executado de forma síncrona até atingir o primeiro Await ponto em que ele é suspenso até que a tarefa esperada seja concluída.The method runs synchronously until it reaches the first Await, at which point it suspends until the awaited task completes. Enquanto isso, o controle é retornado para o chamador do método.In the meantime, control is returned to the caller of the method. Se o método não contiver uma Await expressão ou instrução, o método não será suspenso e será executado como um método síncrono.If the method doesn't contain an Await expression or statement, the method isn't suspended and executes as a synchronous method does. Um aviso do compilador alerta você sobre os métodos assíncronos que não contêm Await porque essa situação pode indicar um erro.A compiler warning alerts you to any async methods that don't contain Await because that situation might indicate an error. Para obter mais informações, consulte o erro do compilador.For more information, see the compiler error.

A Async palavra-chave é uma palavra-chave não reservada.The Async keyword is an unreserved keyword. É uma palavra-chave quando modifica um método ou uma expressão lambda.It is a keyword when it modifies a method or a lambda expression. Em todos os outros contextos, ele é interpretado como um identificador.In all other contexts, it is interpreted as an identifier.

Tipos de retornoReturn Types

Um método assíncrono é um procedimento sub ou um procedimento Function que tem um tipo de retorno de Task ou Task<TResult> .An async method is either a Sub procedure, or a Function procedure that has a return type of Task or Task<TResult>. O método não pode declarar nenhum parâmetro ByRef .The method cannot declare any ByRef parameters.

Você especifica Task(Of TResult) para o tipo de retorno de um método assíncrono se a instrução Return do método tiver um operando do 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. Você usará Task se nenhum valor significativo for retornado quando o método for concluído.You use Task if no meaningful value is returned when the method is completed. Ou seja, uma chamada para o método retorna um Task , mas quando o Task é concluído, qualquer Await instrução que estiver aguardando o Task não produzirá um 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.

As sub-rotinas assíncronas são usadas principalmente para definir manipuladores de eventos em que um Sub procedimento é necessário.Async subroutines are used primarily to define event handlers where a Sub procedure is required. O chamador de uma sub-rotina assíncrona não pode aguardar e não pode capturar exceções que o método gera.The caller of an async subroutine can't await it and can't catch exceptions that the method throws.

Para obter mais informações e exemplos, consulte Tipos de retorno assíncronos.For more information and examples, see Async Return Types.

ExemploExample

Os exemplos a seguir mostram um manipulador de eventos assíncrono, uma expressão lambda Async e um método Async.The following examples show an async event handler, an async lambda expression, and an async method. Para obter um exemplo completo que usa esses elementos, consulte Walkthrough: acessando a Web usando Async e Await.For a full example that uses these elements, see Walkthrough: Accessing the Web by Using Async and Await. É possível baixar o código do passo a passo em Exemplos de código do desenvolvedor.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

Confira tambémSee also