Gör så här: Gör flera webbbegäranden parallellt med hjälp av Async och Await (Visual Basic)
I en asynkron metod startas uppgifter när de skapas. Operatorn Await tillämpas på aktiviteten vid den punkt i metoden där bearbetningen inte kan fortsätta förrän aktiviteten har slutförts. Ofta väntar en uppgift så snart den har skapats, vilket visas i följande exempel.
Dim result = Await someWebAccessMethodAsync(url)
Du kan dock separera skapandet av aktiviteten från att vänta på uppgiften om ditt program har annat arbete att utföra som inte beror på slutförandet av uppgiften.
' 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
Mellan att starta en aktivitet och vänta på den kan du starta andra aktiviteter. De ytterligare aktiviteterna körs implicit parallellt, men inga ytterligare trådar skapas.
Följande program startar tre asynkrona webbnedladdningar och väntar sedan på dem i den ordning de anropas. Observera att aktiviteterna inte alltid slutförs i den ordning de skapas och väntar när du kör programmet. De börjar köras när de skapas och en eller flera av uppgifterna kan slutföras innan metoden når await-uttrycken.
Kommentar
För att slutföra det här projektet måste du ha Visual Studio 2012 eller senare och .NET Framework 4.5 eller senare installerat på datorn.
Ett annat exempel som startar flera aktiviteter samtidigt finns i How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic).
Du kan ladda ned koden för det här exemplet från Kodexempel för utvecklare.
Så här konfigurerar du projektet
Utför följande steg för att konfigurera ett WPF-program. Du hittar detaljerade anvisningar för de här stegen i Genomgång: Åtkomst till webben med hjälp av Async och Await (Visual Basic).
Skapa ett WPF-program som innehåller en textruta och en knapp. Ge knappen
startButton
namnet och ge textrutanresultsTextBox
namnet .Lägg till en referens för System.Net.Http.
I filen MainWindow.xaml.vb lägger du till en
Imports
instruktion förSystem.Net.Http
.
Så här lägger du till koden
I designfönstret MainWindow.xaml dubbelklickar du på knappen för att skapa
startButton_Click
händelsehanteraren i MainWindow.xaml.vb.Kopiera följande kod och klistra in den i brödtexten
startButton_Click
i i MainWindow.xaml.vb.resultsTextBox.Clear() Await CreateMultipleTasksAsync() resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
Koden anropar en asynkron metod,
CreateMultipleTasksAsync
, som driver programmet.Lägg till följande supportmetoder i projektet:
ProcessURLAsync
använder en HttpClient metod för att ladda ned innehållet på en webbplats som en bytematris. StödmetodenProcessURLAsync
visar och returnerar sedan matrisens längd.DisplayResults
visar antalet byte i bytematrisen för varje URL. Den här skärmen visar när varje uppgift har laddats ned.
Kopiera följande metoder och klistra in dem efter
startButton_Click
händelsehanteraren i 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 Sub
Definiera slutligen metoden
CreateMultipleTasksAsync
, som utför följande steg.Metoden deklarerar ett
HttpClient
objekt som du behöver för att komma åt metoden GetByteArrayAsync iProcessURLAsync
.Metoden skapar och startar tre uppgifter av typen Task<TResult>, där
TResult
är ett heltal. När varje aktivitet har slutförtsDisplayResults
visas aktivitetens URL och längden på det nedladdade innehållet. Eftersom aktiviteterna körs asynkront kan den ordning i vilken resultaten visas skilja sig från i vilken ordning de deklarerades.Metoden väntar på att varje aktivitet ska slutföras. Varje
Await
operator pausar körningen avCreateMultipleTasksAsync
tills den väntade aktiviteten har slutförts. Operatorn hämtar också returvärdet från anropet tillProcessURLAsync
från varje slutförd uppgift.När uppgifterna har slutförts och heltalsvärdena har hämtats summerar metoden längden på webbplatserna och visar resultatet.
Kopiera följande metod och klistra in den i din lösning.
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
Välj F5-tangenten för att köra programmet och välj sedan knappen Start .
Kör programmet flera gånger för att kontrollera att de tre aktiviteterna inte alltid slutförs i samma ordning och att den ordning som de slutförs inte nödvändigtvis är den ordning i vilken de skapas och väntar.
Exempel
Följande kod innehåller det fullständiga exemplet.
' 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