Share via


Overzicht: toegang tot internet met behulp van Async and Await (Visual Basic)

U kunt asynchrone programma's eenvoudiger en intuïtiever schrijven met behulp van asynchrone/wachtfuncties. U kunt asynchrone code schrijven die lijkt op synchrone code en de compiler de moeilijke callback-functies en vervolgen die asynchrone code meestal met zich meebrengt, laten verwerken.

Zie Asynchrone programmering met Asynchroon programmeren met Async en Await (Visual Basic) voor meer informatie over de functie Async.

Deze procedure begint met een synchrone WPF-toepassing (Windows Presentation Foundation) waarmee het aantal bytes in een lijst met websites wordt opgeteld. De procedure converteert de toepassing vervolgens naar een asynchrone oplossing met behulp van de nieuwe functies.

U kunt de toepassingen ontwikkelen door het overzicht te voltooien of het voorbeeld te downloaden vanuit de .NET Sample Browser. De voorbeeldcode bevindt zich in het SerialAsyncExample-project .

In dit scenario voert u de volgende taken uit:

Zie de sectie Voorbeeld voor het volledige asynchrone voorbeeld.

Vereisten

Visual Studio 2012 of hoger moet zijn geïnstalleerd op uw computer. Zie de pagina Downloads van Visual Studio voor meer informatie.

Een WPF-toepassing maken

  1. Visual Studio starten.

  2. Kies Bestand, Nieuw, Project in de menubalk.

    Het dialoogvenster Nieuw project wordt geopend.

  3. Kies Visual Basic in het deelvenster Geïnstalleerde sjablonen en kies vervolgens WPF-toepassing in de lijst met projecttypen.

  4. Voer in het tekstvak Naam de AsyncExampleWPFknop OK in en kies vervolgens de knop OK .

    Het nieuwe project wordt weergegeven in Solution Explorer.

Een eenvoudige WPF MainWindow ontwerpen

  1. Kies in de Visual Studio Code-editor het tabblad MainWindow.xaml .

  2. Als het werksetvenster niet zichtbaar is, opent u het menu Beeld en kiest u Werkset.

  3. Voeg een besturingselement Knop en een besturingselement Tekstvak toe aan het Venster MainWindow .

  4. Markeer het besturingselement Tekstvak en stel in het venster Eigenschappen de volgende waarden in:

    • Stel de eigenschap Name in op resultsTextBox.

    • Stel de eigenschap Height in op 250.

    • Stel de eigenschap Width in op 500.

    • Geef op het tabblad Tekst een monoruimtelettertype op, zoals Lucida Console of Global Monospace.

  5. Markeer het besturingselement Knop en stel in het venster Eigenschappen de volgende waarden in:

    • Stel de eigenschap Name in op startButton.

    • Wijzig de waarde van de eigenschap Inhoud van Knop in Start.

  6. Plaats het tekstvak en de knop zodanig dat beide worden weergegeven in het Venster MainWindow .

    Zie Een gebruikersinterface maken met behulp van XAML Designer voor meer informatie over de WPF XAML Designer.

Een verwijzing toevoegen

  1. Markeer in Solution Explorer de naam van uw project.

  2. Kies In de menubalk Project, Verwijzing toevoegen.

    Het dialoogvenster Reference Manager wordt weergegeven.

  3. Controleer boven aan het dialoogvenster of uw project gericht is op .NET Framework 4.5 of hoger.

  4. Kies Framework in het gebied Assembly's als dit nog niet is gekozen.

  5. Schakel in de lijst met namen het selectievakje System.Net.Http in.

  6. Kies de knop OK om het dialoogvenster te sluiten.

Benodigde importinstructies toevoegen

  1. Open in Solution Explorer het snelmenu voor MainWindow.xaml.vb en kies Code weergeven.

  2. Voeg de volgende Imports instructies toe boven aan het codebestand als deze nog niet aanwezig zijn.

    Imports System.Net.Http
    Imports System.Net
    Imports System.IO
    

Een synchrone toepassing maken

  1. Dubbelklik in het ontwerpvenster MainWindow.xaml op de knop Start om de startButton_Click gebeurtenis-handler in MainWindow.xaml.vb te maken.

  2. Kopieer in MainWindow.xaml.vb de volgende code naar de hoofdtekst van startButton_Click:

    resultsTextBox.Clear()
    SumPageSizes()
    resultsTextBox.Text &= vbCrLf & "Control returned to startButton_Click."
    

    De code roept de methode aan waarmee de toepassing SumPageSizeswordt aangeroepen en geeft een bericht weer wanneer het besturingselement terugkeert naar startButton_Click.

  3. De code voor de synchrone oplossing bevat de volgende vier methoden:

    • SumPageSizes, waarmee een lijst met webpagina-URL's wordt opgehaald van SetUpURLList en vervolgens wordt aangeroepen GetURLContents en DisplayResults elke URL verwerkt.

    • SetUpURLList, die een lijst met webadressen maakt en retourneert.

    • GetURLContents, waarmee de inhoud van elke website wordt gedownload en de inhoud wordt geretourneerd als een bytematrix.

    • DisplayResults, waarmee het aantal bytes in de bytematrix voor elke URL wordt weergegeven.

    Kopieer de volgende vier methoden en plak deze onder de startButton_Click gebeurtenis-handler in MainWindow.xaml.vb:

    Private Sub SumPageSizes()
    
        ' Make a list of web addresses.
        Dim urlList As List(Of String) = SetUpURLList()
    
        Dim total = 0
        For Each url In urlList
            ' GetURLContents returns the contents of url as a byte array.
            Dim urlContents As Byte() = GetURLContents(url)
    
            DisplayResults(url, urlContents)
    
            ' Update the total.
            total += urlContents.Length
        Next
    
        ' Display the total count for all of the web addresses.
        resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf & "Total bytes returned:  {0}" & vbCrLf, total)
    End Sub
    
    Private Function SetUpURLList() As List(Of String)
    
        Dim urls = New List(Of String) From
            {
                "https://msdn.microsoft.com/library/windows/apps/br211380.aspx",
                "https://msdn.microsoft.com",
                "https://msdn.microsoft.com/library/hh290136.aspx",
                "https://msdn.microsoft.com/library/ee256749.aspx",
                "https://msdn.microsoft.com/library/hh290138.aspx",
                "https://msdn.microsoft.com/library/hh290140.aspx",
                "https://msdn.microsoft.com/library/dd470362.aspx",
                "https://msdn.microsoft.com/library/aa578028.aspx",
                "https://msdn.microsoft.com/library/ms404677.aspx",
                "https://msdn.microsoft.com/library/ff730837.aspx"
            }
        Return urls
    End Function
    
    Private Function GetURLContents(url As String) As 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.
        ' Note: you can't use HttpWebRequest.GetResponse in a Windows Store app.
        Using response As WebResponse = webReq.GetResponse()
            ' 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.
                responseStream.CopyTo(content)
            End Using
        End Using
    
        ' Return the result as a byte array.
        Return content.ToArray()
    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
    

De synchrone oplossing testen

  1. Kies de F5-toets om het programma uit te voeren en kies vervolgens de knop Start .

    Uitvoer die lijkt op de volgende lijst, moet worden weergegeven:

    msdn.microsoft.com/library/windows/apps/br211380.aspx        383832
    msdn.microsoft.com                                            33964
    msdn.microsoft.com/library/hh290136.aspx               225793
    msdn.microsoft.com/library/ee256749.aspx               143577
    msdn.microsoft.com/library/hh290138.aspx               237372
    msdn.microsoft.com/library/hh290140.aspx               128279
    msdn.microsoft.com/library/dd470362.aspx               157649
    msdn.microsoft.com/library/aa578028.aspx               204457
    msdn.microsoft.com/library/ms404677.aspx               176405
    msdn.microsoft.com/library/ff730837.aspx               143474
    
    Total bytes returned:  1834802
    
    Control returned to startButton_Click.
    

    U ziet dat het enkele seconden duurt om de aantallen weer te geven. Gedurende die tijd wordt de UI-thread geblokkeerd terwijl wordt gewacht tot de aangevraagde resources zijn gedownload. Als gevolg hiervan kunt u het weergavevenster niet verplaatsen, maximaliseren, minimaliseren of zelfs sluiten nadat u de knop Start hebt gekozen. Deze pogingen mislukken totdat de byteaantallen worden weergegeven. Als een website niet reageert, hebt u geen indicatie van welke site is mislukt. Het is moeilijk om te stoppen met wachten en het programma te sluiten.

GetURLContents converteren naar een asynchrone methode

  1. Als u de synchrone oplossing wilt converteren naar een asynchrone oplossing, kunt GetURLContents u het beste beginnen omdat de aanroepen naar de HttpWebRequest.GetResponse methode en de Stream.CopyTo methode de locatie zijn waar de toepassing toegang heeft tot het web. Het .NET Framework maakt de conversie eenvoudig door asynchrone versies van beide methoden op te leveren.

    Zie voor meer informatie over de methoden die worden gebruikt in GetURLContentsWebRequest.

    Notitie

    Terwijl u de stappen in dit scenario volgt, worden er verschillende compilerfouten weergegeven. U kunt deze negeren en doorgaan met het scenario.

    Wijzig de methode die wordt aangeroepen in de derde regel van GetURLContents naar GetResponse de asynchrone, taakgebaseerde GetResponseAsync methode.

    Using response As WebResponse = webReq.GetResponseAsync()
    
  2. GetResponseAsync geeft als resultaat een Task<TResult>. In dit geval heeft de variabele voor het retourneren TResultvan de taak het type WebResponse. De taak is een belofte om een werkelijk WebResponse object te produceren nadat de aangevraagde gegevens zijn gedownload en de taak tot voltooiing is uitgevoerd.

    Als u de WebResponse waarde van de taak wilt ophalen, past u een await-operator toe op de aanroep, GetResponseAsynczoals in de volgende code wordt weergegeven.

    Using response As WebResponse = Await webReq.GetResponseAsync()
    

    De Await operator onderbreekt de uitvoering van de huidige methode, GetURLContentstotdat de wachtende taak is voltooid. Ondertussen keert het besturingselement terug naar de aanroeper van de huidige methode. In dit voorbeeld is GetURLContentsde huidige methode en de aanroeper .SumPageSizes Wanneer de taak is voltooid, wordt het beloofde WebResponse object geproduceerd als de waarde van de wachtende taak en toegewezen aan de variabele response.

    De vorige instructie kan worden gescheiden in de volgende twee instructies om te verduidelijken wat er gebeurt.

    Dim responseTask As Task(Of WebResponse) = webReq.GetResponseAsync()
    Using response As WebResponse = Await responseTask
    

    De aanroep om webReq.GetResponseAsync een Task(Of WebResponse) of Task<WebResponse>. Vervolgens wordt een Await operator toegepast op de taak om de WebResponse waarde op te halen.

    Als uw asynchrone methode hiervoor niet afhankelijk is van de voltooiing van de taak, kan de methode doorgaan met dat werk tussen deze twee instructies, na de aanroep van de asynchrone methode en voordat de wachtoperator wordt toegepast. Zie Voor voorbeelden : Meerdere webaanvragen parallel maken met behulp van Async and Await (Visual Basic) en How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic).

  3. Omdat u de Await operator in de vorige stap hebt toegevoegd, treedt er een compilerfout op. De operator kan alleen worden gebruikt in methoden die zijn gemarkeerd met de Asynchrone modifier. Negeer de fout terwijl u de conversiestappen herhaalt om de aanroep te CopyTo vervangen door een aanroep naar CopyToAsync.

    • Wijzig de naam van de methode die wordt aangeroepen CopyToAsync.

    • De CopyTo of CopyToAsync methode kopieert bytes naar het argument contenten retourneert geen zinvolle waarde. In de synchrone versie is de aanroep naar CopyTo een eenvoudige instructie die geen waarde retourneert. De asynchrone versie, CopyToAsyncretourneert een Task. De taakfuncties zoals 'Task(void)' en maken het mogelijk om de methode te wachten. Pas Await of await op de aanroep toe, CopyToAsynczoals in de volgende code wordt weergegeven.

      Await responseStream.CopyToAsync(content)
      

      In de vorige instructie worden de volgende twee regels code afgekort.

      ' CopyToAsync returns a Task, not a Task<T>.
      Dim copyTask As Task = responseStream.CopyToAsync(content)
      
      ' When copyTask is completed, content contains a copy of
      ' responseStream.
      Await copyTask
      
  4. U hoeft alleen maar GetURLContents de handtekening van de methode aan te passen. U kunt de Await operator alleen gebruiken in methoden die zijn gemarkeerd met de Asynchrone modifier. Voeg de wijzigingsfunctie toe om de methode als asynchrone methode te markeren, zoals in de volgende code wordt weergegeven.

    Private Async Function GetURLContents(url As String) As Byte()
    
  5. Het retourtype van een asynchrone methode kan alleen zijn Task, Task<TResult>. In Visual Basic moet de methode een Function methode zijn die een Task of een Task(Of T), of de methode moet een Sub. Normaal gesproken wordt een Sub methode alleen gebruikt in een asynchrone gebeurtenis-handler, waar Sub dat nodig is. In andere gevallen gebruikt Task(T) u als de voltooide methode een Return-instructie heeft die een waarde van het type T retourneert en u gebruikt Task als de voltooide methode geen zinvolle waarde retourneert.

    Zie Asynchrone retourtypen (Visual Basic) voor meer informatie.

    De methode GetURLContents heeft een retourinstructie en de instructie retourneert een bytematrix. Daarom is het retourtype van de asynchrone versie Taak (T), waarbij T een bytematrix is. Breng de volgende wijzigingen aan in de methodehandtekening:

    • Wijzig het retourtype in Task(Of Byte()).

    • Volgens de conventie hebben asynchrone methoden namen die eindigen op 'Async', dus wijzig de naam van de methode GetURLContentsAsync.

    In de volgende code worden deze wijzigingen weergegeven.

    Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())
    

    Met deze paar wijzigingen is de conversie van GetURLContents een asynchrone methode voltooid.

SumPageSizes converteren naar een asynchrone methode

  1. Herhaal de stappen uit de vorige procedure voor SumPageSizes. Wijzig eerst de aanroep in GetURLContents een asynchrone aanroep.

    • Wijzig de naam van de methode die wordt aangeroepen in GetURLContents GetURLContentsAsync, als u dit nog niet hebt gedaan.

    • Toepassen Await op de taak die GetURLContentsAsync wordt geretourneerd om de bytematrixwaarde te verkrijgen.

    In de volgende code worden deze wijzigingen weergegeven.

    Dim urlContents As Byte() = Await GetURLContentsAsync(url)
    

    Met de vorige toewijzing worden de volgende twee regels code afgekort.

    ' GetURLContentsAsync returns a task. At completion, the task
    ' produces a byte array.
    Dim getContentsTask As Task(Of Byte()) = GetURLContentsAsync(url)
    Dim urlContents As Byte() = Await getContentsTask
    
  2. Breng de volgende wijzigingen aan in de handtekening van de methode:

    • Markeer de methode met de Async wijzigingsfunctie.

    • Voeg Async toe aan de naam van de methode.

    • Er is geen variabele voor het retourneren van taken, T, deze keer omdat SumPageSizesAsync er geen waarde voor T wordt geretourneerd. (De methode heeft geen Return instructie.) De methode moet echter worden Task geretourneerd om te wachten. Wijzig daarom het methodetype van Sub in Function. Het retourtype van de functie is Task.

    In de volgende code worden deze wijzigingen weergegeven.

    Private Async Function SumPageSizesAsync() As Task
    

    De conversie van SumPageSizes naar SumPageSizesAsync is voltooid.

StartButton_Click converteren naar een asynchrone methode

  1. Wijzig in de gebeurtenishandler de naam van de aangeroepen methode van SumPageSizes in SumPageSizesAsync, als u dit nog niet hebt gedaan.

  2. Omdat SumPageSizesAsync dit een asynchrone methode is, wijzigt u de code in de gebeurtenis-handler om het resultaat te wachten.

    De aanroep om de oproep naar binnen GetURLContentsAsyncte SumPageSizesAsync CopyToAsync spiegelen. De aanroep retourneert een Task, niet een Task(T).

    Net als in eerdere procedures kunt u de aanroep converteren met behulp van één instructie of twee instructies. In de volgende code worden deze wijzigingen weergegeven.

    ' One-step async call.
    Await SumPageSizesAsync()
    
    ' Two-step async call.
    Dim sumTask As Task = SumPageSizesAsync()
    Await sumTask
    
  3. Als u wilt voorkomen dat de bewerking per ongeluk opnieuw wordt verzonden, voegt u de volgende instructie toe bovenaan startButton_Click om de knop Start uit te schakelen.

    ' Disable the button until the operation is complete.
    startButton.IsEnabled = False
    

    U kunt de knop aan het einde van de gebeurtenis-handler opnieuw activeren.

    ' Reenable the button in case you want to run the operation again.
    startButton.IsEnabled = True
    

    Zie Reentrancy verwerken in Async Apps (Visual Basic) voor meer informatie over reentrancy.

  4. Voeg tot slot de Async wijziging toe aan de declaratie, zodat de gebeurtenis-handler kan wachten SumPagSizesAsync.

    Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
    

    Normaal gesproken worden de namen van gebeurtenis-handlers niet gewijzigd. Het retourtype wordt niet gewijzigd Task omdat gebeurtenis-handlers procedures moeten zijn Sub in Visual Basic.

    De conversie van het project van synchrone naar asynchrone verwerking is voltooid.

De asynchrone oplossing testen

  1. Kies de F5-toets om het programma uit te voeren en kies vervolgens de knop Start .

  2. Uitvoer die lijkt op de uitvoer van de synchrone oplossing, moet worden weergegeven. Let echter op de volgende verschillen.

    • De resultaten komen niet allemaal tegelijk voor, nadat de verwerking is voltooid. Beide programma's bevatten bijvoorbeeld een regel in startButton_Click het tekstvak. De bedoeling is om het tekstvak tussen uitvoeringen te wissen als u de knop Start voor een tweede keer kiest, nadat één set resultaten is weergegeven. In de synchrone versie wordt het tekstvak gewist vlak voordat de tellingen voor de tweede keer worden weergegeven, wanneer de downloads zijn voltooid en de UI-thread gratis is om ander werk te doen. In de asynchrone versie wordt het tekstvak direct gewist nadat u de knop Start hebt gekozen.

    • Het belangrijkste is dat de UI-thread niet wordt geblokkeerd tijdens de downloads. U kunt het venster verplaatsen of het formaat ervan wijzigen terwijl de webresources worden gedownload, geteld en weergegeven. Als een van de websites traag of niet reageert, kunt u de bewerking annuleren door de knop Sluiten te kiezen (de x in het rode veld in de rechterbovenhoek).

Vervang de methode GetURLContentsAsync door een .NET Framework-methode

  1. Het .NET Framework biedt veel asynchrone methoden die u kunt gebruiken. Een van hen, de HttpClient.GetByteArrayAsync(String) methode, doet precies wat u nodig hebt voor dit scenario. U kunt deze gebruiken in plaats van de GetURLContentsAsync methode die u in een eerdere procedure hebt gemaakt.

    De eerste stap is het maken van een HttpClient object in de SumPageSizesAsync methode. Voeg de volgende declaratie toe aan het begin van de methode.

    ' 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}
    
  2. Vervang SumPageSizesAsyncde aanroep naar uw GetURLContentsAsync methode door een aanroep naar de HttpClient methode.

    Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
    
  3. Verwijder of markeer de GetURLContentsAsync methode die u hebt geschreven.

  4. Kies de F5-toets om het programma uit te voeren en kies vervolgens de knop Start .

    Het gedrag van deze versie van het project moet overeenkomen met het gedrag dat de procedure 'De asynchrone oplossing testen' beschrijft, maar met nog minder inspanning van u.

Opmerking

Hier volgt het volledige voorbeeld van de geconverteerde asynchrone oplossing die gebruikmaakt van de asynchrone GetURLContentsAsync methode. U ziet dat deze sterk lijkt op de oorspronkelijke, synchrone oplossing.

' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http
Imports System.Net
Imports System.IO

Class MainWindow

    Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click

        ' Disable the button until the operation is complete.
        startButton.IsEnabled = False

        resultsTextBox.Clear()

        '' One-step async call.
        Await SumPageSizesAsync()

        ' Two-step async call.
        'Dim sumTask As Task = SumPageSizesAsync()
        'Await sumTask

        resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."

        ' Reenable the button in case you want to run the operation again.
        startButton.IsEnabled = True
    End Sub

    Private Async Function SumPageSizesAsync() As Task

        ' Make a list of web addresses.
        Dim urlList As List(Of String) = SetUpURLList()

        Dim total = 0
        For Each url In urlList
            Dim urlContents As Byte() = Await GetURLContentsAsync(url)

            ' The previous line abbreviates the following two assignment statements.

            '//<snippet21>
            ' GetURLContentsAsync returns a task. At completion, the task
            ' produces a byte array.
            'Dim getContentsTask As Task(Of Byte()) = GetURLContentsAsync(url)
            'Dim urlContents As Byte() = Await getContentsTask

            DisplayResults(url, urlContents)

            ' Update the total.
            total += urlContents.Length
        Next

        ' Display the total count for all of the websites.
        resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
                                             "Total bytes returned:  {0}" & vbCrLf, total)
    End Function

    Private Function SetUpURLList() As List(Of String)

        Dim urls = New List(Of String) From
            {
                "https://msdn.microsoft.com/library/windows/apps/br211380.aspx",
                "https://msdn.microsoft.com",
                "https://msdn.microsoft.com/library/hh290136.aspx",
                "https://msdn.microsoft.com/library/ee256749.aspx",
                "https://msdn.microsoft.com/library/hh290138.aspx",
                "https://msdn.microsoft.com/library/hh290140.aspx",
                "https://msdn.microsoft.com/library/dd470362.aspx",
                "https://msdn.microsoft.com/library/aa578028.aspx",
                "https://msdn.microsoft.com/library/ms404677.aspx",
                "https://msdn.microsoft.com/library/ff730837.aspx"
            }
        Return urls
    End Function

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

            ' The previous statement abbreviates the following two statements.

            'Dim responseTask As Task(Of WebResponse) = webReq.GetResponseAsync()
            'Using response As WebResponse = Await responseTask

            ' 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.
                Await responseStream.CopyToAsync(content)

                ' The previous statement abbreviates the following two statements.

                ' CopyToAsync returns a Task, not a Task<T>.
                'Dim copyTask As Task = responseStream.CopyToAsync(content)

                ' When copyTask is completed, content contains a copy of
                ' responseStream.
                'Await copyTask
            End Using
        End Using

        ' Return the result as a byte array.
        Return content.ToArray()
    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

De volgende code bevat het volledige voorbeeld van de oplossing die gebruikmaakt van de HttpClient methode. GetByteArrayAsync

' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http
Imports System.Net
Imports System.IO

Class MainWindow

    Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click

        resultsTextBox.Clear()

        ' Disable the button until the operation is complete.
        startButton.IsEnabled = False

        ' One-step async call.
        Await SumPageSizesAsync()

        ' Two-step async call.
        'Dim sumTask As Task = SumPageSizesAsync()
        'Await sumTask

        resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."

        ' Reenable the button in case you want to run the operation again.
        startButton.IsEnabled = True
    End Sub

    Private Async Function SumPageSizesAsync() 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}

        ' Make a list of web addresses.
        Dim urlList As List(Of String) = SetUpURLList()

        Dim total = 0
        For Each url In urlList
            ' GetByteArrayAsync returns a task. At completion, the task
            ' produces a byte array.
            Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)

            ' The following two lines can replace the previous assignment statement.
            'Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
            'Dim urlContents As Byte() = Await getContentsTask

            DisplayResults(url, urlContents)

            ' Update the total.
            total += urlContents.Length
        Next

        ' Display the total count for all of the websites.
        resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
                                             "Total bytes returned:  {0}" & vbCrLf, total)
    End Function

    Private Function SetUpURLList() As List(Of String)

        Dim urls = New List(Of String) From
            {
                "https://msdn.microsoft.com/library/windows/apps/br211380.aspx",
                "https://msdn.microsoft.com",
                "https://msdn.microsoft.com/library/hh290136.aspx",
                "https://msdn.microsoft.com/library/ee256749.aspx",
                "https://msdn.microsoft.com/library/hh290138.aspx",
                "https://msdn.microsoft.com/library/hh290140.aspx",
                "https://msdn.microsoft.com/library/dd470362.aspx",
                "https://msdn.microsoft.com/library/aa578028.aspx",
                "https://msdn.microsoft.com/library/ms404677.aspx",
                "https://msdn.microsoft.com/library/ff730837.aspx"
            }
        Return urls
    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

Zie ook