Sdílet prostřednictvím


Návod: Přístup k webu pomocí Async a Await (Visual Basic)

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

Další informace o funkci Async naleznete v tématu Asynchronní programování pomocí Async a Await (Visual Basic).

Tento názorný postup začíná synchronní aplikací 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í.

Aplikace můžete vyvíjet buď dokončením návodu, nebo stažením ukázky z ukázkového prohlížeče .NET. Ukázkový kód je v projektu SerialAsyncExample .

V tomto názorném postupu provedete následující úlohy:

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

Požadavky

V počítači musí být nainstalovaná sada Visual Studio 2012 nebo novější. Další informace najdete na stránce se soubory ke stažení sady Visual Studio.

Vytvoření aplikace WPF

  1. Spusťte Visual Studio.

  2. Na řádku nabídek zvolte Soubor, Nový, Projekt.

    Otevře se dialogové okno Nový projekt .

  3. V podokně Nainstalované šablony zvolte Visual Basic a pak v seznamu typů projektů zvolte Aplikaci WPF.

  4. Do textového pole Název zadejte AsyncExampleWPFa pak zvolte tlačítko OK .

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

Návrh jednoduchého WPF MainWindow

  1. V editoru Visual Studio Code zvolte kartu MainWindow.xaml .

  2. Pokud okno Panel nástrojů není viditelné, otevřete nabídku Zobrazení a pak zvolte Panel nástrojů.

  3. Přidání ovládacího prvku Button a ovládacího prvku TextBox do okna MainWindow

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

    • Nastavte vlastnost Name na resultsTextBoxhodnotu .

    • Nastavte vlastnost Height na 250.

    • Nastavte vlastnost Width na hodnotu 500.

    • Na kartě Text zadejte monospaced písmo, například Lucida Console nebo Global Monospace.

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

    • Nastavte vlastnost Name na startButtonhodnotu .

    • Změňte hodnotu vlastnosti Content z tlačítka na Start.

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

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

Přidání odkazu

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

  2. Na řádku nabídek zvolte Projekt, Přidat odkaz.

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

  3. V horní části dialogového okna ověřte, že váš projekt cílí na rozhraní .NET Framework 4.5 nebo vyšší.

  4. V oblasti Sestavení zvolte Rozhraní, pokud ještě není zvoleno.

  5. V seznamu názvů zaškrtněte políčko System.Net.Http .

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

Přidání nezbytných příkazů 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. Pokud ještě nejsou k dispozici, přidejte do horní části souboru kódu následující Imports příkazy.

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

Vytvoření synchronní aplikace

  1. V okně návrhu, MainWindow.xaml, poklikáním na tlačítko Start vytvořte obslužnou rutinu startButton_Click události v MainWindow.xaml.vb.

  2. V 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, SumPageSizesa zobrazí zprávu při návratu ovládacího prvku .startButton_Click

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

    • SumPageSizes, který získá seznam adres URL webové stránky od SetUpURLList a potom volá GetURLContents a DisplayResults zpracovává každou adresu URL.

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

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

    • DisplayResults, který zobrazuje počet bajtů v bajtovém poli pro každou adresu URL.

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

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

  1. Zvolte klávesu F5, aby se program spustil, a pak zvolte tlačítko Start .

    Měl by se zobrazit výstup podobný 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 zobrazení počtů trvá několik sekund. Během této doby se vlákno uživatelského rozhraní zablokuje, zatímco čeká na stažení požadovaných prostředků. V důsledku toho nemůžete po výběru tlačítka Start přesunout, maximalizovat, minimalizovat ani zavřít okno zobrazení. Tyto snahy selžou, dokud se nebudou zobrazovat počty bajtů. Pokud web nereaguje, nemáte žádnou informaci o tom, který web selhal. Je obtížné dokonce přestat čekat a zavřít program.

Převod GetURLContents na asynchronní metodu

  1. Chcete-li převést synchronní řešení na asynchronní řešení, je nejlepší začít, GetURLContents protože volání HttpWebRequest.GetResponse metody a Stream.CopyTo metody jsou tam, kde aplikace přistupuje k webu. Rozhraní .NET Framework usnadňuje převod zadáním asynchronních verzí obou metod.

    Další informace ometodch GetURLContentsWebRequest

    Poznámka:

    Jak budete postupovat podle kroků v tomto návodu, zobrazí se několik chyb kompilátoru. Můžete je ignorovat a pokračovat v návodu.

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

    Using response As WebResponse = webReq.GetResponseAsync()
    
  2. GetResponseAsync vrátí hodnotu Task<TResult>. V tomto případě má návratová proměnnáTResult úkolu , má typ WebResponse. Úkol je příslib, že po stažení požadovaných dat vytvoří skutečný WebResponse objekt a úkol se spustí k dokončení.

    Pokud chcete načíst WebResponse hodnotu z úkolu, použijte operátor Await na volání GetResponseAsync, jak ukazuje následující kód.

    Using response As WebResponse = Await webReq.GetResponseAsync()
    

    Operátor Await pozastaví provádění aktuální metody , GetURLContentsaž do dokončení očekávaného úkolu. Do té doby se ovládací prvek vrátí volajícímu aktuální metody. V tomto příkladu je GetURLContentsaktuální metoda a volající je SumPageSizes. Po dokončení úkolu se přislíbený WebResponse objekt vytvoří jako hodnota očekávaného úkolu a přiřadí se proměnné response.

    Předchozí příkaz lze rozdělit do následujících dvou příkazů, aby bylo jasné, co se stane.

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

    Volání pro webReq.GetResponseAsync vrácení nebo Task(Of WebResponse)Task<WebResponse>. Potom se Await na úkol použije operátor, který načte WebResponse hodnotu.

    Pokud má asynchronní metoda práci, která nezávisí na dokončení úlohy, metoda může pokračovat v práci mezi těmito dvěma příkazy, po volání asynchronní metody a před použitím operátoru await. Příklady najdete v tématu Postupy: Paralelní provádění více webových požadavků pomocí Async a Await (Visual Basic) a Postupy: Rozšíření návodu asynchronního použití 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 označených modifikátorem Async . Chybu ignorujte, zatímco zopakujete kroky převodu, abyste hovor CopyTo nahradili voláním CopyToAsync.

    • Změňte název metody, která je volána na CopyToAsync.

    • CopyTo Nebo CopyToAsync metoda zkopíruje bajty do argumentu contenta nevrací smysluplnou hodnotu. V synchronní verzi je volání CopyTo jednoduchého příkazu, který nevrací hodnotu. Asynchronní verze , CopyToAsyncvrátí hodnotu Task. Úloha funguje jako Task(void) a umožňuje, aby byla metoda očekávána. Použít 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. Jediné, co zbývá udělat GetURLContents , je upravit podpis metody. Operátor můžete použít Await pouze v metodách označených modifikátorem Async . Přidejte modifikátor pro 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 Taskpouze , Task<TResult>. V jazyce Visual Basic musí být Function metoda, která vrací nebo Task , Task(Of T)nebo metoda musí být .Sub Sub Metoda se obvykle používá pouze v asynchronní obslužné rutině události, kde Sub je vyžadována. V jiných případech použijete Task(T) , pokud dokončená metoda obsahuje příkaz Return , který vrací hodnotu typu T, a použijete Task , pokud dokončená metoda nevrací smysluplnou hodnotu.

    Další informace naleznete v tématu Asynchronní návratové typy (Visual Basic).

    Metoda GetURLContents má návratový příkaz a příkaz vrátí bajtové pole. Proto návratový typ asynchronní verze je Task(T), kde T je bajtové pole. V podpisu 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", takže metodu GetURLContentsAsyncpřejmenujte .

    Následující kód ukazuje tyto změny.

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

    S těmito několika změnami je převod GetURLContents na asynchronní metodu dokončen.

Převod SumPageSizes na asynchronní metodu

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

    • Pokud jste to ještě neudělali, změňte název metody, ze které se volá GetURLContentsGetURLContentsAsync.

    • Platí Await pro úlohu, která GetURLContentsAsync se vrátí k získání bajtové hodnoty pole.

    Následující kód ukazuje tyto změny.

    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 podpisu metody proveďte následující změny:

    • Označte metodu modifikátorem Async .

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

    • Neexistuje žádná návratová proměnná úkolu, T, tentokrát, protože SumPageSizesAsync nevrací hodnotu pro T. (Metoda nemá žádný Return příkaz.) Metoda však musí vrátit Task , aby byla očekávaná. Proto změňte typ metody z Sub na Function. Návratový typ funkce je Task.

    Následující kód ukazuje tyto změny.

    Private Async Function SumPageSizesAsync() As Task
    

    Převod SumPageSizes na SumPageSizesAsync dokončení.

Převod 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. Protože SumPageSizesAsync je asynchronní metoda, změňte kód v obslužné rutině události tak, aby čekal na výsledek.

    Volání, které SumPageSizesAsync zrcadlí volání do CopyToAsyncGetURLContentsAsync. Volání vrátí , Taskne Task(T).

    Stejně jako v předchozích postupech můžete volání převést pomocí jednoho nebo dvou příkazů. Následující kód ukazuje tyto změny.

    ' One-step async call.
    Await SumPageSizesAsync()
    
    ' Two-step async call.
    Dim sumTask As Task = SumPageSizesAsync()
    Await sumTask
    
  3. Pokud chcete zabránit náhodnému zadání operace, přidejte do horní části startButton_Click následující příkaz a zakažte tlačítko Start .

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

    Tlačítko můžete obnovit 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 opětovném zařazení najdete v tématu Zpracování opětovného vytváření v asynchronních aplikacích (Visual Basic).

  4. Nakonec do deklarace přidejte Async modifikátor tak, aby obslužná rutina události mohl 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 obvykle nemění. Návratový typ se nezmění, Task protože obslužné rutiny událostí musí být Sub procedury v jazyce 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, aby se program spustil, a pak zvolte tlačítko Start .

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

    • Po dokončení zpracování nedojde ke všem výsledkům najednou. Například oba programy obsahují řádek, který startButton_Click vymaže textové pole. Záměrem je vymazat textové pole mezi spuštěními, pokud po druhém výběru tlačítka Start po zobrazení jedné sady výsledků. V synchronní verzi se textové pole vymaže těsně před tím, než se počet 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 okamžitě po výběru tlačítka Start vymaže.

    • Nejdůležitější je, že vlákno uživatelského rozhraní není během stahování blokováno. 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 některý z webů je pomalý nebo nereaguje, můžete operaci zrušit tak, že zvolíte tlačítko Zavřít (x v červeném poli v pravém horním rohu).

Nahraďte metodu GetURLContentsAsync metodou rozhraní .NET Framework.

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

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

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

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

  4. Zvolte klávesu F5, aby se program spustil, a pak zvolte tlačítko Start .

    Chování této verze projektu by mělo odpovídat chování, které popisuje procedura "Test asynchronního řešení", ale s ještě menším úsilím od vás.

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á metodu HttpClient , 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é