Návod: přístup k webu pomocí modifikátoru Async a operátoru Await (Visual Basic)

Asynchronní programy můžete napsat snadněji a intuitivnější pomocí funkcí Async/await. Můžete napsat asynchronní kód, který vypadá jako synchronní kód, a nechat kompilátor zpracovávat obtížné funkce zpětného volání a pokračování, které obvykle zahrnuje asynchronní kód.

Další informace o funkci Async naleznete v tématu asynchronní programování s Async a await (Visual Basic).

tento návod začíná s aplikací synchronní Windows Presentation Foundation (WPF), která sečte počet bajtů v seznamu webů. Návod pak převede aplikaci na asynchronní řešení pomocí nových funkcí.

Můžete vyvíjet aplikace buď dokončením návodu, nebo stažením ukázky z prohlížeče .NET Sample. Vzorový kód je v projektu SerialAsyncExample .

V tomto návodu provedete následující úlohy:

Kompletní asynchronní příklad najdete v části příklad .

Požadavky

v počítači musí být nainstalováno Visual Studio 2012 nebo novější. další informace najdete na stránce Visual Studio ke stažení .

Vytvoření aplikace WPF

  1. Spusťte Visual Studio.

  2. na řádku nabídek klikněte na položku soubor, nový Project.

    otevře se dialogové okno nový Project .

  3. v podokně nainstalované šablony zvolte možnost Visual Basic a v seznamu typů projektů zvolte možnost aplikace WPF .

  4. Do textového pole název zadejte AsyncExampleWPF a pak klikněte na tlačítko OK .

    Nový projekt se zobrazí v Průzkumník řešení.

Návrh jednoduchého MainWindow WPF

  1. v editoru Visual Studio Code klikněte na kartu MainWindow. xaml .

  2. Pokud není okno panelu nástrojů viditelné, otevřete nabídku zobrazení a zvolte možnost Sada nástrojů.

  3. Přidejte ovládací prvek tlačítko a ovládací prvek TextBox do okna MainWindow .

  4. Zvýrazněte ovládací prvek TextBox a v okně vlastnosti nastavte následující hodnoty:

    • Nastavte vlastnost název na resultsTextBox .

    • Nastavte vlastnost Height na 250.

    • Nastavte vlastnost Width na 500.

    • Na kartě text zadejte Neproporcionální písmo, například Lucida konzolu nebo globální neproporcionální.

  5. Zvýrazněte ovládací prvek tlačítko a v okně vlastnosti nastavte následující hodnoty:

    • Nastavte vlastnost název na startButton .

    • Změňte hodnotu vlastnosti obsah z tlačítka na Spustit.

  6. Umístěte textové pole a tlačítko tak, aby se obě zobrazily v okně MainWindow .

    Další informace o Návrhář XAML WPF naleznete v tématu Vytvoření uživatelského rozhraní pomocí Návrhář XAML.

Přidat odkaz

  1. V Průzkumník řešení zvýrazněte název svého projektu.

  2. na panelu nabídek vyberte Project, přidat odkaz.

    Zobrazí se dialogové okno Správce odkazů .

  3. v horní části dialogového okna ověřte, zda je projekt cílen na .NET Framework 4,5 nebo vyšší.

  4. V oblasti sestavení vyberte možnost rozhraní , pokud již není zvolena.

  5. V seznamu názvů vyberte zaškrtávací políčko System .NET. http .

  6. Kliknutím na tlačítko OK zavřete dialogové okno.

Přidat nezbytné příkazy Imports

  1. V Průzkumník řešení otevřete místní nabídku pro MainWindow. XAML. vb a pak zvolte Zobrazit kód.

  2. Přidejte následující Imports příkazy v horní části souboru kódu, pokud již nejsou přítomny.

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

Vytvoření synchronní aplikace

  1. V okně návrh MainWindow. XAML dvakrát klikněte na tlačítko Start a vytvořte startButton_Click obslužnou rutinu události v souboru MainWindow. XAML. vb.

  2. V souboru MainWindow. XAML. vb zkopírujte následující kód do textu startButton_Click :

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

    Kód volá metodu, která řídí aplikaci, SumPageSizes a zobrazí zprávu, když se ovládací prvek vrátí do startButton_Click .

  3. Kód pro synchronní řešení obsahuje následující čtyři metody:

    • SumPageSizes, který získá seznam adres URL webových stránek z SetUpURLList a potom zavolá GetURLContents a DisplayResults zpracuje každou adresu URL.

    • SetUpURLList, který provede a vrátí seznam webových adres.

    • GetURLContents, který stáhne obsah jednotlivých webů a vrátí obsah jako bajtové pole.

    • DisplayResultszobrazuje počet bajtů v bajtovém poli pro každou adresu URL.

    Zkopírujte následující čtyři metody a pak je vložte pod startButton_Click obslužnou rutinu události v souboru 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
    

Test synchronního řešení

  1. Zvolte klávesu F5 ke spuštění programu a pak klikněte na tlačítko Start .

    Měl by se zobrazit výstup, který se podobá následujícímu seznamu:

    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.
    

    Všimněte si, že pro zobrazení počtů trvá několik sekund. Během této doby je vlákno uživatelského rozhraní blokované při čekání na stažení požadovaných prostředků. V důsledku toho nebudete moct okno zobrazení po kliknutí na tlačítko Start přesunout, maximalizovat, minimalizovat ani ani zavřít. Tato snaha selže, dokud se nezobrazují počty bajtů. Pokud web neodpovídá, nemusíte mít žádné informace o tom, který web selhal. Je obtížné dokonce ukončit čekání a ukončit program.

Převést GetURLContents na asynchronní metodu

  1. Chcete-li převést synchronní řešení na asynchronní řešení, je nejlepší místo, kde je spuštěno, GetURLContents protože volání HttpWebRequest.GetResponse metody a Stream.CopyTo metody jsou místo, kde aplikace přistupuje k webu. .NET Framework usnadňuje převod tím, že poskytuje asynchronní verze obou metod.

    Další informace o metodách, které jsou používány v nástroji GetURLContents , naleznete v tématu WebRequest .

    Poznámka

    Při provedení kroků v tomto návodu se zobrazí několik chyb kompilátoru. Můžete je ignorovat a pokračovat v tomto návodu.

    Změňte metodu, která je volána na třetím řádku GetURLContents od GetResponse do asynchronní metody založené na úlohách GetResponseAsync .

    Using response As WebResponse = webReq.GetResponseAsync()
    
  2. GetResponseAsync Vrátí Task<TResult> . V tomto případě má vrácená proměnná úlohy TResult typ WebResponse . Úkol je příslib k vytvoření skutečného WebResponse objektu po stažení požadovaných dat a dokončení úlohy.

    Chcete-li načíst WebResponse hodnotu z úkolu, použijte operátor await pro volání metody GetResponseAsync , jak ukazuje následující kód.

    Using response As WebResponse = Await webReq.GetResponseAsync()
    

    AwaitOperátor pozastaví provádění aktuální metody, GetURLContents dokud není dokončen očekávaný úkol. Mezitím se ovládací prvek vrátí volajícímu aktuální metody. V tomto příkladu je aktuální metoda GetURLContents a volající je SumPageSizes . Po dokončení úkolu je přislíbený WebResponse objekt vytvořen jako hodnota očekávaného úkolu a přiřazený k proměnné response .

    Předchozí příkaz může být rozdělen do následujících dvou příkazů k objasnění toho, co se stane.

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

    Volání webReq.GetResponseAsync funkce vrátí Task(Of WebResponse) nebo Task<WebResponse> . Pak Await se pro úlohu použije operátor, aby se načetla WebResponse hodnota.

    Pokud vaše asynchronní metoda funguje na to, že nezávisí na dokončení úlohy, může metoda pokračovat v práci s těmito dvěma příkazy po volání asynchronní metody a před použitím operátoru await. příklady naleznete v tématu How to: revícenásobné webové požadavky paralelně pomocí Async a Await (Visual Basic) a postupy: rozšíříte-li asynchronní návod pomocí Task. WhenAll (Visual Basic).

  3. Protože jste přidali Await operátor v předchozím kroku, dojde k chybě kompilátoru. Operátor lze použít pouze v metodách, které jsou označeny modifikátorem Async . Ignorujte chybu při opakování kroků převodu k nahrazení volání CopyTo voláním metody CopyToAsync .

    • Změňte název metody, na kterou se volá CopyToAsync .

    • CopyToMetoda nebo CopyToAsync kopíruje bajty do svého argumentu, content a nevrací smysluplnou hodnotu. V synchronní verzi je volání na CopyTo jednoduchý příkaz, který nevrací hodnotu. Asynchronní verze, CopyToAsync vrátí a Task . Úkol funguje jako "Task (void)" a umožňuje, aby metoda byla očekávána. Použijte Await nebo await na volání CopyToAsync , jak ukazuje následující kód.

      Await responseStream.CopyToAsync(content)
      

      Předchozí příkaz zkracuje následující dva řádky kódu.

      ' 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. Vše, co je potřeba udělat v nástroji, GetURLContents je úprava signatury metody. Operátor lze použít Await pouze v metodách, které jsou označeny modifikátorem Async . Přidejte modifikátor k označení metody jako asynchronní metody, jak ukazuje následující kód.

    Private Async Function GetURLContents(url As String) As Byte()
    
  5. Návratový typ asynchronní metody může být pouze Task , Task<TResult> . v Visual Basic musí být metoda Function , která vrací Task nebo Task(Of T) , nebo metoda musí být Sub . SubMetoda je typicky používána pouze v asynchronní obslužné rutině události, kde Sub je to požadováno. V ostatních případech použijete, Task(T) Pokud má metoda Completed návratový příkaz, který vrací hodnotu typu T, a použijete, Task Pokud metoda Completed nevrátí smysluplnou hodnotu.

    Další informace naleznete v tématu Async Return Types (Visual Basic).

    Metoda GetURLContents obsahuje příkaz return a příkaz vrátí bajtové pole. Proto návratový typ asynchronní verze je Task (T), kde T je pole bajtů. V signatuře metody proveďte následující změny:

    • Změňte návratový typ na Task(Of Byte()) .

    • Podle konvence mají asynchronní metody názvy, které končí na "Async", proto přejmenujte metodu GetURLContentsAsync .

    Následující kód tyto změny znázorňuje.

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

    U těchto několika změn GetURLContents je převod na asynchronní metodu dokončen.

Převést SumPageSizes na asynchronní metodu

  1. Opakujte kroky z předchozího postupu pro SumPageSizes . Nejprve změňte volání na GetURLContents asynchronní volání.

    • Změňte název metody, která je volána z GetURLContents na GetURLContentsAsync , pokud jste tak již neučinili.

    • Použijte Await u úlohy, která se GetURLContentsAsync vrátí k získání hodnoty bajtového pole.

    Následující kód tyto změny znázorňuje.

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

    Předchozí přiřazení zkracuje následující dva řádky kódu.

    ' 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. V signatuře metody proveďte následující změny:

    • Označte metodu Async modifikátorem.

    • Do názvu metody přidejte "Async".

    • V tuto chvíli neexistuje žádná vrácená proměnná úlohy, T, protože SumPageSizesAsync nevrací hodnotu pro T. (metoda nemá žádný Return příkaz.) Metoda však musí vracet, Task aby bylo možné očekávat. Proto změňte typ metody z Sub na Function . Návratový typ funkce je Task .

    Následující kód tyto změny znázorňuje.

    Private Async Function SumPageSizesAsync() As Task
    

    Převod SumPageSizes na SumPageSizesAsync je dokončen.

Převést startButton_Click na asynchronní metodu

  1. V obslužné rutině události změňte název volané metody z SumPageSizes na SumPageSizesAsync , pokud jste to ještě neudělali.

  2. Vzhledem k tomu SumPageSizesAsync , že je asynchronní metoda, změňte kód v obslužné rutině události tak, aby čekal na výsledek.

    Volání SumPageSizesAsync zrcadlí volání do CopyToAsync v GetURLContentsAsync . Volání vrátí a Task , nikoli Task(T) .

    Stejně jako v předchozích postupech lze volání převést pomocí jednoho příkazu nebo dvou příkazů. Následující kód tyto změny znázorňuje.

    ' One-step async call.
    Await SumPageSizesAsync()
    
    ' Two-step async call.
    Dim sumTask As Task = SumPageSizesAsync()
    Await sumTask
    
  3. Chcete-li zabránit nechtěnému znovu zadat operaci, přidejte následující příkaz v horní části, startButton_Click čímž zakážete tlačítko Start .

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

    Tlačítko lze znovu povolit na konci obslužné rutiny události.

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

    Další informace o Vícenásobný přístup najdete v tématu zpracování Vícenásobný přístup v asynchronních aplikacích (Visual Basic).

  4. Nakonec přidejte Async modifikátor do deklarace tak, aby mohla obslužná rutina události očekávat SumPagSizesAsync .

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

    Názvy obslužných rutin událostí se typicky nemění. Návratový typ se nezměnil na, Task protože obslužné rutiny události musí být Sub procedury v Visual Basic.

    Převod projektu z synchronního na asynchronní zpracování je dokončen.

Testování asynchronního řešení

  1. Zvolte klávesu F5 ke spuštění programu a pak klikněte na tlačítko Start .

  2. Měl by se zobrazit výstup, který se podobá výstupu synchronního řešení. Všimněte si ale následujících rozdílů.

    • Po dokončení zpracování se všechny výsledky neprojeví ve stejnou dobu. Například oba programy obsahují řádek startButton_Click , který vymaže textové pole. Záměrem je vymazat textové pole mezi spuštěním, pokud zvolíte tlačítko Spustit pro druhý čas, poté, co se objeví jedna sada výsledků. V synchronní verzi je textové pole vymazáno těsně před tím, než se počty zobrazí podruhé, po dokončení stahování a vlákno uživatelského rozhraní je volné pro další práci. V asynchronní verzi se textové pole vymaže ihned po kliknutí na tlačítko Start .

    • Ve většině případů není vlákno UI během stahování zablokované. Během stahování, počítání a zobrazování webových prostředků můžete okno přesunout nebo změnit jeho velikost. Pokud je jeden z webů pomalý nebo neodpovídá, můžete operaci zrušit výběrem tlačítka Zavřít (x v poli červené v pravém horním rohu).

nahraďte metodu GetURLContentsAsync metodou .NET Framework.

  1. .NET Framework poskytuje mnoho asynchronních metod, které můžete použít. Jedna z nich, HttpClient.GetByteArrayAsync(String) metoda, dělá přesně to, co potřebujete pro tento návod. Místo GetURLContentsAsync metody, kterou jste vytvořili v předchozím postupu, ji můžete použít.

    Prvním krokem je vytvoření HttpClient objektu v SumPageSizesAsync metodě. Přidejte následující deklaraci na začátek metody.

    ' 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. V SumPageSizesAsync, části nahraďte volání GetURLContentsAsync metody voláním HttpClient metody.

    Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
    
  3. Odeberte nebo zakomentujte GetURLContentsAsync metodu, kterou jste napsali.

  4. Zvolte klávesu F5 ke spuštění programu a pak klikněte na tlačítko Start .

    Chování této verze projektu by se mělo shodovat s chováním, které popisuje postup testování asynchronního řešení, ale s ještě menším úsilím.

Příklad

Následuje úplný příklad převedeného asynchronního řešení, které používá asynchronní GetURLContentsAsync metodu. Všimněte si, že se silně podobá původnímu synchronnímu řešení.

' 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

Následující kód obsahuje úplný příklad řešení, které používá HttpClient metodu, 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

Viz také