Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Em um método assíncrono, as tarefas são iniciadas quando são criadas. O operador Await é aplicado à tarefa no ponto no método em que o processamento não pode continuar até que a tarefa seja concluída. Geralmente, uma tarefa é aguardada assim que é criada, como mostra o exemplo a seguir.
Dim result = Await someWebAccessMethodAsync(url)
No entanto, você pode separar a criação da tarefa de aguardar a tarefa se o programa tiver outro trabalho para realizar que não dependa da conclusão da tarefa.
' The following line creates and starts the task.
Dim myTask = someWebAccessMethodAsync(url)
' While the task is running, you can do other work that does not depend
' on the results of the task.
' . . . . .
' The application of Await suspends the rest of this method until the task is
' complete.
Dim result = Await myTask
Entre iniciar uma tarefa e aguardar, você pode iniciar outras tarefas. As tarefas adicionais são executadas implicitamente em paralelo, mas nenhum thread adicional é criado.
O programa a seguir inicia três downloads assíncronos da Web e os aguarda na ordem em que são chamados. Observe que, quando você executa o programa, as tarefas nem sempre são concluídas na ordem em que são criadas e aguardadas. Eles começam a ser executadas quando são criadas e uma ou mais tarefas podem terminar antes que o método alcance as expressões await.
Observação
Para concluir este projeto, você deve ter o Visual Studio 2012 ou superior e o .NET Framework 4.5 ou superior instalado em seu computador.
Para outro exemplo que inicia várias tarefas ao mesmo tempo, consulte Como estender o passo a passo assíncrono usando Task.WhenAll (Visual Basic).
Você pode baixar o código para este exemplo de Exemplos de Código do Desenvolvedor.
Para configurar o projeto
Para configurar um aplicativo WPF, conclua as etapas a seguir. Você pode encontrar instruções detalhadas para estas etapas no Passo a passo: acessando a Web usando Async e Await (Visual Basic).
Crie um aplicativo WPF que contenha uma caixa de texto e um botão. Nomeie o botão
startButtone nomeie a caixaresultsTextBoxde texto.Adicionar uma referência para System.Net.Http.
No arquivo MainWindow.xaml.vb, adicione uma instrução
ImportsparaSystem.Net.Http.
Para adicionar o código
Na janela de design, MainWindow.xaml, clique duas vezes no botão para criar o
startButton_Clickmanipulador de eventos no MainWindow.xaml.vb.Copie o código a seguir e cole-o no corpo do
startButton_ClickMainWindow.xaml.vb.resultsTextBox.Clear() Await CreateMultipleTasksAsync() resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."O código chama um método assíncrono,
CreateMultipleTasksAsyncque conduz o aplicativo.Adicione os seguintes métodos de suporte ao projeto:
ProcessURLAsyncusa um HttpClient método para baixar o conteúdo de um site como uma matriz de bytes. O método de suporte, em seguida,ProcessURLAsyncexibe e retorna o comprimento da matriz.DisplayResultsexibe o número de bytes na matriz de bytes para cada URL. Esta exibição mostra quando cada tarefa terminou de baixar.
Copie os métodos a seguir e cole-os após o
startButton_Clickmanipulador de eventos em MainWindow.xaml.vb.Private Async Function ProcessURLAsync(url As String, client As HttpClient) As Task(Of Integer) Dim byteArray = Await client.GetByteArrayAsync(url) DisplayResults(url, byteArray) Return byteArray.Length End Function Private Sub DisplayResults(url As String, content As Byte()) ' Display the length of each website. The string format ' is designed to be used with a monospaced font, such as ' Lucida Console or Global Monospace. Dim bytes = content.Length ' Strip off the "https://". Dim displayURL = url.Replace("https://", "") resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes) End SubPor fim, defina o método
CreateMultipleTasksAsync, que executa as etapas a seguir.O método declara um objeto
HttpClient, que você precisa acessar pelo método GetByteArrayAsync emProcessURLAsync.O método cria e inicia três tarefas do tipo Task<TResult>, onde
TResultestá um inteiro. À medida que cada tarefa é concluída,DisplayResultsexibe a URL da tarefa e o comprimento do conteúdo baixado. Como as tarefas estão sendo executadas de forma assíncrona, a ordem na qual os resultados aparecem pode ser diferente da ordem em que foram declaradas.O método aguarda a conclusão de cada tarefa. Cada operador
Awaitsuspende a execução deCreateMultipleTasksAsyncaté que a tarefa seja concluída. O operador também recupera o valor retornado da chamada aoProcessURLAsyncde cada tarefa concluída.Quando as tarefas foram concluídas e os valores inteiros foram recuperados, o método soma os comprimentos dos sites e exibe o resultado.
Copie o método a seguir e cole-o em sua solução.
Private Async Function CreateMultipleTasksAsync() As Task ' Declare an HttpClient object, and increase the buffer size. The ' default buffer size is 65,536. Dim client As HttpClient = New HttpClient() With {.MaxResponseContentBufferSize = 1000000} ' Create and start the tasks. As each task finishes, DisplayResults ' displays its length. Dim download1 As Task(Of Integer) = ProcessURLAsync("https://msdn.microsoft.com", client) Dim download2 As Task(Of Integer) = ProcessURLAsync("https://msdn.microsoft.com/library/hh156528(VS.110).aspx", client) Dim download3 As Task(Of Integer) = ProcessURLAsync("https://msdn.microsoft.com/library/67w7t67f.aspx", client) ' Await each task. Dim length1 As Integer = Await download1 Dim length2 As Integer = Await download2 Dim length3 As Integer = Await download3 Dim total As Integer = length1 + length2 + length3 ' Display the total count for all of the websites. resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf & "Total bytes returned: {0}" & vbCrLf, total) End FunctionEscolha a tecla F5 para executar o programa e escolha o botão Iniciar .
Execute o programa várias vezes para verificar se as três tarefas nem sempre terminam na mesma ordem e se a ordem em que elas terminam não é necessariamente a ordem na qual elas são criadas e aguardadas.
Exemplo
O código a seguir contém o exemplo completo.
' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http
Class MainWindow
Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
resultsTextBox.Clear()
Await CreateMultipleTasksAsync()
resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
End Sub
Private Async Function CreateMultipleTasksAsync() As Task
' Declare an HttpClient object, and increase the buffer size. The
' default buffer size is 65,536.
Dim client As HttpClient =
New HttpClient() With {.MaxResponseContentBufferSize = 1000000}
' Create and start the tasks. As each task finishes, DisplayResults
' displays its length.
Dim download1 As Task(Of Integer) =
ProcessURLAsync("https://msdn.microsoft.com", client)
Dim download2 As Task(Of Integer) =
ProcessURLAsync("https://msdn.microsoft.com/library/hh156528(VS.110).aspx", client)
Dim download3 As Task(Of Integer) =
ProcessURLAsync("https://msdn.microsoft.com/library/67w7t67f.aspx", client)
' Await each task.
Dim length1 As Integer = Await download1
Dim length2 As Integer = Await download2
Dim length3 As Integer = Await download3
Dim total As Integer = length1 + length2 + length3
' Display the total count for all of the websites.
resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
"Total bytes returned: {0}" & vbCrLf, total)
End Function
Private Async Function ProcessURLAsync(url As String, client As HttpClient) As Task(Of Integer)
Dim byteArray = Await client.GetByteArrayAsync(url)
DisplayResults(url, byteArray)
Return byteArray.Length
End Function
Private Sub DisplayResults(url As String, content As Byte())
' Display the length of each website. The string format
' is designed to be used with a monospaced font, such as
' Lucida Console or Global Monospace.
Dim bytes = content.Length
' Strip off the "https://".
Dim displayURL = url.Replace("https://", "")
resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes)
End Sub
End Class