Compartilhar via


Assíncrono (Visual Basic)

O Async modificador indica que o método ou a expressão lambda que ele modifica é assíncrono. Esses métodos são chamados de métodos assíncronos.

Um método assíncrono fornece uma maneira conveniente de fazer um trabalho potencialmente de execução longa sem bloquear o thread do chamador. O chamador de um método assíncrono pode retomar seu trabalho sem esperar que o método assíncrono seja concluído.

Observação

As palavras-chave Async e Await foram introduzidas no Visual Studio 2012. Para obter uma introdução à programação assíncrona, consulte Programação assíncrona com Async e Await.

O exemplo a seguir mostra a estrutura de um método assíncrono. Por convenção, os nomes de método assíncrono terminam em "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 . O método é executado de forma síncrona até chegar ao primeiro Await, momento em que suspende até que a tarefa esperada seja concluída. Enquanto isso, o controle é retornado ao chamador do método. 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. Um aviso do compilador alerta você para qualquer método assíncrono que não contenha Await porque essa situação pode indicar um erro. Para obter mais informações, consulte o erro do compilador.

A Async palavra-chave é uma palavra-chave não reservada. É uma palavra-chave quando modifica um método ou uma expressão lambda. Em todos os outros contextos, ele é interpretado como um identificador.

Tipos de retorno

Um método assíncrono é um sub procedimento ou um procedimento de função que tem um tipo de retorno ou TaskTask<TResult>. O método não pode declarar parâmetros ByRef .

Especifique Task(Of TResult) o tipo de retorno de um método assíncrono se a instrução Return do método tiver um operando do tipo TResult. Você usará Task se nenhum valor significativo for retornado quando o método for concluído. Ou seja, uma chamada para o método retorna um Task, mas quando a Task instrução é concluída, qualquer Await instrução que esteja aguardando Task não produz um valor de resultado.

As sub-rotinas assíncronas são usadas principalmente para definir manipuladores de eventos em que um Sub procedimento é necessário. O chamador de uma sub-rotina assíncrona não pode aguardar e não consegue capturar exceções geradas pelo método.

Para obter mais informações e exemplos, consulte Tipos de retorno assíncronos.

Exemplo

Os exemplos a seguir mostram um manipulador de eventos assíncrono, uma expressão lambda assíncrona e um método assíncrono. Para obter um exemplo completo que usa esses elementos, consulte Passo a passo: acessando a Web usando Async e Await. Você pode baixar o exemplo do Navegador de Exemplo do .NET. O código de exemplo está no projeto SerialAsyncExample .

' 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

Consulte também