Megosztás a következőn keresztül:


Útmutató: A web elérése az Async és a Await használatával (Visual Basic)

Az aszinkron programokat egyszerűbben és intuitívabban is megírhatja az aszinkron/várakozási funkciók használatával. A szinkron kódhoz hasonló aszinkron kódot írhat, és a fordító kezelheti az aszinkron kód által általában járó nehéz visszahívási függvényeket és folytatásokat.

Az Async funkcióval kapcsolatos további információkért lásd : Aszinkron programozás az Async és a Await használatával (Visual Basic).

Ez az útmutató egy szinkron Windows megjelenítési alaprendszer (WPF) alkalmazással kezdődik, amely a webhelyek listájában szereplő bájtok számát összegzi. Az útmutató ezután az új funkciók használatával aszinkron megoldássá alakítja az alkalmazást.

Az alkalmazásokat úgy fejlesztheti, hogy végrehajtja az útmutatót, vagy letölti a mintát a .NET mintaböngészőből. A példakód a SerialAsyncExample projektben található.

Ebben az útmutatóban a következő feladatokat hajtja végre:

A teljes aszinkron példához lásd a Példa szakaszt.

Előfeltételek

A Visual Studio 2012-et vagy újabb verziót telepíteni kell a számítógépre. További információt a Visual Studio Letöltések oldalán talál.

WPF-alkalmazás létrehozása

  1. Indítsa el a Visual Studiót.

  2. A menüsávon válassza a Fájl, Új, Projekt lehetőséget.

    Megnyílik az Új projekt párbeszédpanel.

  3. A Telepített sablonok panelen válassza a Visual Basic, majd a WPF-alkalmazás lehetőséget a projekttípusok listájából.

  4. A Név szövegmezőbe írja beAsyncExampleWPF, majd válassza az OK gombot.

    Az új projekt megjelenik Megoldáskezelő.

Egyszerű WPF MainWindow tervezése

  1. A Visual Studio Code Editorban válassza a MainWindow.xaml lapot.

  2. Ha az Eszközkészlet ablak nem látható, nyissa meg a Nézet menüt, majd válassza az Eszközkészlet lehetőséget.

  3. Gombvezérlő és Szövegdoboz vezérlőelem hozzáadása a MainWindow ablakhoz.

  4. Jelölje ki a Szövegdoboz vezérlőt, és a Tulajdonságok ablakban állítsa be a következő értékeket:

    • A Név tulajdonság beállítása a következőreresultsTextBox: .

    • Állítsa a Height tulajdonságot 250-re.

    • Állítsa a Width tulajdonságot 500-ra.

    • A Szöveg lapon adjon meg egy monoter betűtípust, például a Lucida konzolt vagy a Globális monotert.

  5. Jelölje ki a Gomb vezérlőelemet, és a Tulajdonságok ablakban állítsa be a következő értékeket:

    • A Név tulajdonság beállítása a következőrestartButton: .

    • Módosítsa a Tartalom tulajdonság értékét Gombról Start értékre.

  6. Helyezze a szövegdobozt és a gombot úgy, hogy mindkettő megjelenjen a MainWindow ablakban.

    A WPF XAML Designerrel kapcsolatos további információkért lásd : Felhasználói felület létrehozása az XAML Designer használatával.

Hivatkozás hozzáadása

  1. A Megoldáskezelő jelölje ki a projekt nevét.

  2. A menüsávon válassza a Project, Add Reference (Hivatkozás hozzáadása) lehetőséget.

    Megjelenik a Referenciakezelő párbeszédpanel.

  3. A párbeszédpanel tetején ellenőrizze, hogy a projekt a 4.5-ös vagy újabb .NET-keretrendszer célozza-e.

  4. A Szerelvények területen válassza a Keretrendszer lehetőséget, ha még nincs kiválasztva.

  5. A nevek listájában jelölje be a System.Net.Http jelölőnégyzetet.

  6. A párbeszédpanel bezárásához kattintson az OK gombra.

Szükséges importálási utasítások hozzáadása

  1. A Megoldáskezelő nyissa meg a MainWindow.xaml.vb helyi menüjét, majd válassza a Kód megtekintése lehetőséget.

  2. Ha még nincs jelen, adja hozzá a következő Imports utasításokat a kódfájl tetején.

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

Szinkron alkalmazás létrehozása

  1. A MainWindow.xaml tervezőablakában kattintson duplán a Start gombra az eseménykezelő létrehozásához a startButton_Click MainWindow.xaml.vb.

  2. A MainWindow.xaml.vb másolja a következő kódot a következő szövegtörzsbe startButton_Click:

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

    A kód meghívja az alkalmazást meghajtó metódust, SumPageSizesés egy üzenetet jelenít meg, amikor a vezérlő visszatér startButton_Click.

  3. A szinkron megoldás kódja a következő négy módszert tartalmazza:

    • SumPageSizes, amely lekéri a weblap URL-címeinek listáját, SetUpURLList majd meghívja GetURLContents és DisplayResults feldolgozza az egyes URL-címeket.

    • SetUpURLList, amely a webcímek listáját készíti és adja vissza.

    • GetURLContents, amely letölti az egyes webhelyek tartalmát, és bájttömbként adja vissza a tartalmat.

    • DisplayResults, amely az egyes URL-címek bájttömbjében lévő bájtok számát jeleníti meg.

    Másolja ki a következő négy metódust, majd illessze be őket az eseménykezelő alá MainWindow.xaml.vb startButton_Click :

    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
    

A szinkron megoldás tesztelése

  1. A program futtatásához válassza az F5 billentyűt, majd a Start gombot.

    A következő listához hasonló kimenetnek kell megjelennie:

    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.
    

    Figyelje meg, hogy a számok megjelenítése néhány másodpercet vesz igénybe. Ez idő alatt a felhasználói felületi szál le lesz tiltva, amíg a kért erőforrások letöltésére vár. Ennek eredményeképpen a Start gomb kiválasztása után nem lehet áthelyezni, maximalizálni, kicsinyíteni vagy akár bezárni a megjelenítési ablakot. Ezek az erőfeszítések mindaddig sikertelenek, amíg a bájtok száma meg nem jelenik. Ha egy webhely nem válaszol, nincs jele annak, hogy melyik webhely meghiúsult. Még a várakozást is nehéz leállítani, és bezárni a programot.

GetURLContents konvertálása aszinkron metódussá

  1. A szinkron megoldás aszinkron megoldássá alakításához a legjobb kiindulópont az, ha GetURLContents a metódusra HttpWebRequest.GetResponse és a Stream.CopyTo metódusra irányuló hívások az alkalmazás webes elérésének helye. A .NET-keretrendszer megkönnyíti az átalakítást azáltal, hogy mindkét módszer aszinkron verzióit adja meg.

    A használt GetURLContentsmetódusokról további információt a következő témakörben talál WebRequest:

    Feljegyzés

    Az útmutató lépéseit követve számos fordítási hiba jelenik meg. Figyelmen kívül hagyhatja őket, és folytathatja az útmutatót.

    Módosítsa a harmadik sorban GetURLContents GetResponse meghívott metódust az aszinkron, feladatalapú GetResponseAsync metódusra.

    Using response As WebResponse = webReq.GetResponseAsync()
    
  2. GetResponseAsync egy Task<TResult>. Ebben az esetben a feladat visszatérési változója TResulttípussal WebResponserendelkezik. A feladat ígéret arra, hogy a kért adatok letöltése és a feladat végrehajtása után tényleges WebResponse objektumot hoz létre.

    Ha le szeretné kérni az WebResponse értéket a tevékenységből, alkalmazzon egy Await operátort a hívásraGetResponseAsync, ahogyan az az alábbi kódban is látható.

    Using response As WebResponse = Await webReq.GetResponseAsync()
    

    Az Await operátor felfüggeszti az aktuális metódus végrehajtását, GetURLContentsamíg a várt tevékenység be nem fejeződik. Addig is a vezérlő visszatér az aktuális metódus hívójához. Ebben a példában az aktuális metódus az GetURLContents, és a hívó az SumPageSizes. Amikor a tevékenység befejeződött, az ígért WebResponse objektum a várt tevékenység értékeként jön létre, és hozzá lesz rendelve a változóhoz response.

    Az előző utasítás a következő két utasításra bontható, hogy tisztázzuk, mi történik.

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

    A hívás egy webReq.GetResponseAsync Task(Of WebResponse) vagy Task<WebResponse>. Ezután a rendszer egy operátort Await alkalmaz a feladatra az érték lekéréséhez WebResponse .

    Ha az aszinkron metódusnak van olyan feladata, amely nem függ a feladat befejezésétől, a metódus folytathatja a munkát a két utasítás között, az aszinkron metódus hívása után és a várakozási operátor alkalmazása előtt. Példák : Több webes kérés párhuzamos létrehozása az Async és a Await (Visual Basic) használatával, valamint a How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic) (How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic) (Visual Basic) (Az Async útmutató kiterjesztése a Task.WhenAll (Visual Basic) használatával.

  3. Mivel az előző lépésben hozzáadta az Await operátort, fordítási hiba történik. Az operátor csak az Async módosítóval megjelölt metódusokban használható. Hagyja figyelmen kívül a hibát, miközben megismétli az átalakítás lépéseit, hogy a hívást CopyTo egy hívásra CopyToAsynccserélje le.

    • Módosítsa annak a metódusnak a nevét, amelynek a neve meghívva CopyToAsyncvan.

    • A CopyTo vagy CopyToAsync metódus bájtokat másol az argumentumba, contentés nem ad vissza értelmes értéket. A szinkron verzióban a hívás CopyTo egy egyszerű utasítás, amely nem ad vissza értéket. Az aszinkron verzió egy CopyToAsyncTask. A tevékenység a "Task(void)" függvényhez hasonlóan működik, és lehetővé teszi a metódus várakozását. Alkalmazza Await vagy await a hívásra, CopyToAsyncahogy az alábbi kód mutatja.

      Await responseStream.CopyToAsync(content)
      

      Az előző utasítás a következő két kódsort rövidít.

      ' 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. Mindössze annyit kell elvégezni GetURLContents , hogy módosítsa a metódus aláírását. Az operátort csak az Await Async módosítóval megjelölt metódusokban használhatja. Adja hozzá a módosítót, hogy a metódust aszinkron metódusként jelölje meg, ahogy az alábbi kód is mutatja.

    Private Async Function GetURLContents(url As String) As Byte()
    
  5. Az aszinkron metódus visszatérési típusa csak Taska . Task<TResult> A Visual Basicben a metódusnak olyannak kell lennie Function , amely egy Task vagy egy Task(Of T)értéket ad vissza, vagy a metódusnak egynek Subkell lennie. A metódusokat általában Sub csak aszinkron eseménykezelőben használják, ahol Sub szükség van gombra. Más esetekben akkor használja Task(T) , ha a befejezett metódus visszatérési utasítása T típusú értéket ad vissza, és akkor használja Task , ha a kész metódus nem ad vissza értelmes értéket.

    További információ: Async Return Types (Visual Basic).

    A metódus GetURLContents visszatérési utasítással rendelkezik, az utasítás pedig egy bájttömböt ad vissza. Ezért az aszinkron verzió visszatérési típusa a Task(T), ahol a T egy bájttömb. Végezze el a következő módosításokat a metódus-aláírásban:

    • Módosítsa a visszatérési típust a következőre Task(Of Byte()): .

    • Konvenció szerint az aszinkron metódusoknak "Async" végződésű neveik vannak, ezért nevezze át a metódust GetURLContentsAsync.

    Az alábbi kód ezeket a módosításokat mutatja be.

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

    Ezzel a kevés módosítással az aszinkron metódusra való konvertálás GetURLContents befejeződött.

SumPageSizes konvertálása aszinkron metódussá

  1. Ismételje meg az előző eljárás lépéseit a következőhöz SumPageSizes: . Először módosítsa a hívást GetURLContents aszinkron hívásra.

    • Ha még nem tette meg, módosítsa annak a metódusnak GetURLContentsAsynca nevét, amelyről GetURLContents a metódust meghívta.

    • Alkalmazza Await a visszaadott feladatra GetURLContentsAsync a bájttömb értékének lekéréséhez.

    Az alábbi kód ezeket a módosításokat mutatja be.

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

    Az előző hozzárendelés a következő két kódsort rövidít.

    ' 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égezze el a következő módosításokat a metódus aláírásában:

    • Jelölje meg a metódust a Async módosítóval.

    • Adja hozzá az "Async" nevet a metódus nevéhez.

    • Ezúttal nincs feladatvisszaváltozó, T, mert SumPageSizesAsync nem aD értéket ad vissza. (A metódus nem Return tartalmaz utasítást.) A metódusnak azonban a várt értéket kell visszaadnia Task . Ezért módosítsa a metódus típusát Sub a következőre Function: . A függvény visszatérési típusa: Task.

    Az alábbi kód ezeket a módosításokat mutatja be.

    Private Async Function SumPageSizesAsync() As Task
    

    A konvertálás SumPageSizes SumPageSizesAsync befejeződött.

StartButton_Click átalakítása aszinkron metódussá

  1. Az eseménykezelőben módosítsa a hívott metódus SumPageSizes SumPageSizesAsyncnevét , ha még nem tette meg.

  2. Mivel SumPageSizesAsync aszinkron módszerről van szó, módosítsa az eseménykezelőben lévő kódot az eredményre való várakozáshoz.

    A hívás visszatükrözi SumPageSizesAsync a hívást CopyToAsync a következőben GetURLContentsAsync: . A hívás a Task, nem pedig a Task(T).

    A korábbi eljárásokhoz hasonlóan a hívást egy vagy két utasítással is átalakíthatja. Az alábbi kód ezeket a módosításokat mutatja be.

    ' One-step async call.
    Await SumPageSizesAsync()
    
    ' Two-step async call.
    Dim sumTask As Task = SumPageSizesAsync()
    Await sumTask
    
  3. Ha meg szeretné akadályozni a művelet véletlen újraküldését, a Start gomb letiltásához adja hozzá a következő utasítást a lap tetejénstartButton_Click.

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

    Az eseménykezelő végén lévő gombot újra lehet újrakenni.

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

    Az újrabehelyezésről további információt az Async Apps (Visual Basic) újraküldési funkciójának kezelése című témakörben talál.

  4. Végül adja hozzá a Async módosítót a deklarációhoz, hogy az eseménykezelő várni SumPagSizesAsynctudja.

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

    Az eseménykezelők neve általában nem változik. A visszatérési típus nem változik, Task mert az eseménykezelőknek eljárásoknak kell lenniük Sub a Visual Basicben.

    A projekt szinkronról aszinkron feldolgozásra való konvertálása befejeződött.

Az aszinkron megoldás tesztelése

  1. A program futtatásához válassza az F5 billentyűt, majd a Start gombot.

  2. A szinkron megoldás kimenetéhez hasonló kimenetnek kell megjelennie. Figyelje meg azonban a következő különbségeket.

    • Az eredmények nem egyszerre, a feldolgozás befejezése után következnek be. Például mindkét program tartalmaz egy sort, amely startButton_Click törli a szövegdobozt. A szándék az, hogy törölje a szövegdobozt a futtatások között, ha másodszorra választja a Start gombot egy találatkészlet megjelenése után. A szinkron verzióban a szövegmező nem sokkal a darabszám második megjelenése előtt, a letöltések befejeződése után, a felhasználói felület szála pedig szabadon végezhető el. Az aszinkron verzióban a szövegmező azonnal törlődik a Start gomb kiválasztása után.

    • A legfontosabb, hogy a felhasználói felületi szál nem lesz blokkolva a letöltések során. A webes erőforrások letöltése, számlálása és megjelenítése közben áthelyezheti vagy átméretezheti az ablakot. Ha az egyik webhely lassú vagy nem válaszol, a bezárás gomb (a jobb felső sarokban lévő piros mezőben lévő x) kiválasztásával megszakíthatja a műveletet.

Cserélje le a GetURLContentsAsync metódust egy .NET-keretrendszer metódusra

  1. A .NET-keretrendszer számos aszinkron módszert kínál, amelyeket használhat. Az egyik, a HttpClient.GetByteArrayAsync(String) módszer pontosan azt teszi, amire szüksége van ehhez az útmutatóhoz. A korábbi eljárásban létrehozott metódus helyett GetURLContentsAsync használhatja.

    Az első lépés egy HttpClient objektum létrehozása a SumPageSizesAsync metódusban. Adja hozzá a következő deklarációt a metódus elején.

    ' 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. Ebben SumPageSizesAsyncaz esetben cserélje le a metódus hívását GetURLContentsAsync a HttpClient metódus hívására.

    Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
    
  3. Távolítsa el vagy fűzzön megjegyzést az GetURLContentsAsync Ön által írt metódushoz.

  4. A program futtatásához válassza az F5 billentyűt, majd a Start gombot.

    A projekt ezen verziójának viselkedésének meg kell egyeznie azzal a viselkedéssel, amelyet az "Aszinkron megoldás tesztelése" eljárás ír le, de még kevesebb erőfeszítést igényel Öntől.

Példa

Az alábbiakban az aszinkron metódust használó konvertált aszinkron GetURLContentsAsync megoldás teljes példája látható. Figyelje meg, hogy erősen hasonlít az eredeti, szinkron megoldásra.

' 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

Az alábbi kód a metódust használó megoldás teljes példáját HttpClient tartalmazza. 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

Lásd még