Partilhar via


Aguardar o operador (Visual Basic)

Você aplica o operador de Await a um operando em um método assíncrono ou o método para suspender a execução do método até que a tarefa deve terminar.A tarefa representa trabalho contínuo.

O método é usado em que Await deve ter um modificador de Async .Método, definido usando o modificador de Async , e geralmente contendo uma ou mais expressões de Await , é conhecido como um método de async.

ObservaçãoObservação

As palavras-chave de Async e de Await foram introduzidos no Visual Studio 2012.Para obter informações sobre novos recursos nesta versão, consulte Novidades no Visual Studio 2012 RC.

Para obter uma introdução à programação de async, consulte Programação com Async assíncrona e esperar (C# e Visual Basic).

Normalmente, à tarefa que você aplica o operador de Await é o valor de retorno de uma chamada a um método que implementa Padrão assíncrono baseado chave, isto é, Task ou Task<TResult>.

No código a seguir, o método GetByteArrayAsync de HttpClient retorna getContentsTask, Task(Of Byte()).A tarefa é uma promessa gerar real da matriz de bytes quando a operação é concluída.O operador de Await é aplicado a getContentsTask para suspender a execução em SumPageSizesAsync até que getContentsTask seja concluída.Entretanto, o controle é retornado para o chamador de SumPageSizesAsync.Quando getContentsTask terminar, a expressão de Await avalia como uma 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
Observação importanteImportante

Para um exemplo completo, consulte Passo a passo: Acessando a Web usando Async e aguardar (C# e Visual Basic).Você pode baixar o exemplo Exemplos de código do desenvolvedor no site da Microsoft.O exemplo está no projeto de AsyncWalkthrough_HttpClient.

Se Await é aplicado ao resultado de uma chamada de método que retorna Task(Of TResult), o tipo da expressão de Await é TResult.Se Await é aplicado ao resultado de uma chamada de método que retorna Task, a expressão de Await não retorna um valor.O exemplo a seguir ilustra a diferença.

' 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()

Uma expressão ou instrução de Await não apenas no segmento que está executando o.Em vez disso, faz com que o compilador assine anterior o restante do método de async, após a expressão de Await , como uma continuação na tarefa esperada.O controle retorna para o chamador do método de async.Quando a tarefa termina, chama sua continuação, e a execução do método de async continua onde parou.

Uma expressão de Await pode ocorrer apenas no corpo de um método imediatamente incluindo ou de expressão lambda que é sinalizado por um modificador de Async .O termo espera serve como uma palavra-chave somente nesse contexto.Em outro lugar, é interpretado como um identificador.No método de async ou da expressão lambda, uma expressão de Await não pode ocorrer em uma expressão de consulta, no bloco de catch ou de finally de uma instrução de Try… catch… finally , na expressão variável de controle de loop de um loop de For ou de For Each , ou no corpo de uma instrução de SyncLock .

Exceções

A maioria dos métodos de async retornam Task ou Task<TResult>.As propriedades de tarefa retornado transportam informações sobre seus status e histórico, como se a tarefa estiver concluída, se o método de async causou a exceção ou esteve cancelado, e o que o resultado final é.O operador de Await acessar essas propriedades.

Se você pretende ajustar um método retornando de async que causa uma exceção, os rethrows de operador de Await a exceção.

Se você pretende ajustar um método retornando de async que foi cancelado, os rethrows de operador de AwaitOperationCanceledException.

Uma única tarefa que está em um estado criticado é possível refletir várias exceções.Por exemplo, a tarefa pode ser o resultado de uma chamada a Task.WhenAll.Quando você espera uma tarefa, os rethrows apenas um da operação de espera de exceções.No entanto, você não pode prever de exceções que é rethrown.

Para exemplos de manipulação de erro de métodos de async, consulte Try...Catch...Instrução finally (Visual Basic).

Exemplo

O exemplo de formulários do Windows ilustra o uso de Await em um método de async, WaitAsynchronouslyAsync.Contraste o comportamento desse método com o comportamento de WaitSynchronously.Sem um operador de Await , WaitSynchronously executa sincronamente independentemente do uso do modificador de Async na sua definição e em uma chamada para Thread.Sleep no corpo.

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

Consulte também

Tarefas

Passo a passo: Acessando a Web usando Async e aguardar (C# e Visual Basic)

Referência

Async (Visual Basic)

Conceitos

Programação com Async assíncrona e esperar (C# e Visual Basic)