Dela via


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

  1. 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 startButtonnamnet och ge textrutan resultsTextBoxnamnet .

    • Lägg till en referens för System.Net.Http.

    • I filen MainWindow.xaml.vb lägger du till en Imports instruktion för System.Net.Http.

Så här lägger du till koden

  1. I designfönstret MainWindow.xaml dubbelklickar du på knappen för att skapa startButton_Click händelsehanteraren i MainWindow.xaml.vb.

  2. 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.

  3. 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ödmetoden ProcessURLAsync 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
    
  4. 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 i ProcessURLAsync.

    • Metoden skapar och startar tre uppgifter av typen Task<TResult>, där TResult är ett heltal. När varje aktivitet har slutförts DisplayResults 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 av CreateMultipleTasksAsync tills den väntade aktiviteten har slutförts. Operatorn hämtar också returvärdet från anropet till ProcessURLAsync 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
    
  5. 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

Se även