Ú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:
- WPF-alkalmazás létrehozása
- Egyszerű WPF MainWindow tervezése
- Hivatkozás hozzáadása
- Szükséges importálási utasítások hozzáadása
- Szinkron alkalmazás létrehozása
- A szinkron megoldás tesztelése
- GetURLContents konvertálása aszinkron metódussá
- SumPageSizes konvertálása aszinkron metódussá
- StartButton_Click átalakítása aszinkron metódussá
- Az aszinkron megoldás tesztelése
- Cserélje le a GetURLContentsAsync metódust egy .NET-keretrendszer metódusra
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
Indítsa el a Visual Studiót.
A menüsávon válassza a Fájl, Új, Projekt lehetőséget.
Megnyílik az Új projekt párbeszédpanel.
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.
A Név szövegmezőbe írja be
AsyncExampleWPF
, majd válassza az OK gombot.Az új projekt megjelenik Megoldáskezelő.
Egyszerű WPF MainWindow tervezése
A Visual Studio Code Editorban válassza a MainWindow.xaml lapot.
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.
Gombvezérlő és Szövegdoboz vezérlőelem hozzáadása a MainWindow ablakhoz.
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őre
resultsTextBox
: .Á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.
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őre
startButton
: .Módosítsa a Tartalom tulajdonság értékét Gombról Start értékre.
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
A Megoldáskezelő jelölje ki a projekt nevét.
A menüsávon válassza a Project, Add Reference (Hivatkozás hozzáadása) lehetőséget.
Megjelenik a Referenciakezelő párbeszédpanel.
A párbeszédpanel tetején ellenőrizze, hogy a projekt a 4.5-ös vagy újabb .NET-keretrendszer célozza-e.
A Szerelvények területen válassza a Keretrendszer lehetőséget, ha még nincs kiválasztva.
A nevek listájában jelölje be a System.Net.Http jelölőnégyzetet.
A párbeszédpanel bezárásához kattintson az OK gombra.
Szükséges importálási utasítások hozzáadása
A Megoldáskezelő nyissa meg a MainWindow.xaml.vb helyi menüjét, majd válassza a Kód megtekintése lehetőséget.
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
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.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érstartButton_Click
.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ívjaGetURLContents
ésDisplayResults
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
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á
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
GetURLContents
metó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()
GetResponseAsync
egy Task<TResult>. Ebben az esetben a feladat visszatérési változójaTResult
típussal WebResponserendelkezik. A feladat ígéret arra, hogy a kért adatok letöltése és a feladat végrehajtása után ténylegesWebResponse
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,GetURLContents
amí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 azGetURLContents
, és a hívó azSumPageSizes
. Amikor a tevékenység befejeződött, az ígértWebResponse
objektum a várt tevékenység értékeként jön létre, és hozzá lesz rendelve a változóhozresponse
.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)
vagyTask<WebResponse>
. Ezután a rendszer egy operátortAwait
alkalmaz a feladatra az érték lekéréséhezWebResponse
.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.
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ástCopyTo
egy hívásraCopyToAsync
cserélje le.Módosítsa annak a metódusnak a nevét, amelynek a neve meghívva CopyToAsyncvan.
A
CopyTo
vagyCopyToAsync
metódus bájtokat másol az argumentumba,content
és nem ad vissza értelmes értéket. A szinkron verzióban a hívásCopyTo
egy egyszerű utasítás, amely nem ad vissza értéket. Az aszinkron verzió egyCopyToAsync
Task. 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. AlkalmazzaAwait
vagyawait
a hívásra,CopyToAsync
ahogy 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
Mindössze annyit kell elvégezni
GetURLContents
, hogy módosítsa a metódus aláírását. Az operátort csak azAwait
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()
Az aszinkron metódus visszatérési típusa csak Taska . Task<TResult> A Visual Basicben a metódusnak olyannak kell lennie
Function
, amely egyTask
vagy egyTask(Of T)
értéket ad vissza, vagy a metódusnak egynekSub
kell lennie. A metódusokat általábanSub
csak aszinkron eseménykezelőben használják, aholSub
szükség van gombra. Más esetekben akkor használjaTask(T)
, ha a befejezett metódus visszatérési utasítása T típusú értéket ad vissza, és akkor használjaTask
, 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á
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ástGetURLContents
aszinkron hívásra.Ha még nem tette meg, módosítsa annak a metódusnak
GetURLContentsAsync
a nevét, amelyrőlGetURLContents
a metódust meghívta.Alkalmazza
Await
a visszaadott feladatraGetURLContentsAsync
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
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 nemReturn
tartalmaz utasítást.) A metódusnak azonban a várt értéket kell visszaadniaTask
. Ezért módosítsa a metódus típusátSub
a következőreFunction
: . 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á
Az eseménykezelőben módosítsa a hívott metódus
SumPageSizes
SumPageSizesAsync
nevét , ha még nem tette meg.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ástCopyToAsync
a következőbenGetURLContentsAsync
: . A hívás aTask
, nem pedig aTask(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
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én
startButton_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.
Végül adja hozzá a
Async
módosítót a deklarációhoz, hogy az eseménykezelő várniSumPagSizesAsync
tudja.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ükSub
a Visual Basicben.A projekt szinkronról aszinkron feldolgozásra való konvertálása befejeződött.
Az aszinkron megoldás tesztelése
A program futtatásához válassza az F5 billentyűt, majd a Start gombot.
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
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}
Ebben
SumPageSizesAsync
az esetben cserélje le a metódus hívásátGetURLContentsAsync
aHttpClient
metódus hívására.Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
Távolítsa el vagy fűzzön megjegyzést az
GetURLContentsAsync
Ön által írt metódushoz.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
- Aszinkron minta: A webes útmutató elérése (C# és Visual Basic)
- Operátor várakozása
- Aszinkron
- Aszinkron programozás Async és Await használatával (Visual Basic)
- Aszinkron visszatérési típusok (Visual Basic)
- Feladatalapú aszinkron programozás (TAP)
- Útmutató: Az Async útmutató kiterjesztése a Task.WhenAll (Visual Basic) használatával
- Útmutató: Több webkérelem párhuzamos létrehozása az Async és a Await használatával (Visual Basic)