Overzicht: toegang tot internet met behulp van Async and Await (Visual Basic)
U kunt asynchrone programma's eenvoudiger en intuïtiever schrijven met behulp van asynchrone/wachtfuncties. U kunt asynchrone code schrijven die lijkt op synchrone code en de compiler de moeilijke callback-functies en vervolgen die asynchrone code meestal met zich meebrengt, laten verwerken.
Zie Asynchrone programmering met Asynchroon programmeren met Async en Await (Visual Basic) voor meer informatie over de functie Async.
Deze procedure begint met een synchrone WPF-toepassing (Windows Presentation Foundation) waarmee het aantal bytes in een lijst met websites wordt opgeteld. De procedure converteert de toepassing vervolgens naar een asynchrone oplossing met behulp van de nieuwe functies.
U kunt de toepassingen ontwikkelen door het overzicht te voltooien of het voorbeeld te downloaden vanuit de .NET Sample Browser. De voorbeeldcode bevindt zich in het SerialAsyncExample-project .
In dit scenario voert u de volgende taken uit:
- Een WPF-toepassing maken
- Een eenvoudige WPF MainWindow ontwerpen
- Een verwijzing toevoegen
- Benodigde importinstructies toevoegen
- Een synchrone toepassing maken
- De synchrone oplossing testen
- GetURLContents converteren naar een asynchrone methode
- SumPageSizes converteren naar een asynchrone methode
- StartButton_Click converteren naar een asynchrone methode
- De asynchrone oplossing testen
- Vervang de methode GetURLContentsAsync door een .NET Framework-methode
Zie de sectie Voorbeeld voor het volledige asynchrone voorbeeld.
Vereisten
Visual Studio 2012 of hoger moet zijn geïnstalleerd op uw computer. Zie de pagina Downloads van Visual Studio voor meer informatie.
Een WPF-toepassing maken
Visual Studio starten.
Kies Bestand, Nieuw, Project in de menubalk.
Het dialoogvenster Nieuw project wordt geopend.
Kies Visual Basic in het deelvenster Geïnstalleerde sjablonen en kies vervolgens WPF-toepassing in de lijst met projecttypen.
Voer in het tekstvak Naam de
AsyncExampleWPF
knop OK in en kies vervolgens de knop OK .Het nieuwe project wordt weergegeven in Solution Explorer.
Een eenvoudige WPF MainWindow ontwerpen
Kies in de Visual Studio Code-editor het tabblad MainWindow.xaml .
Als het werksetvenster niet zichtbaar is, opent u het menu Beeld en kiest u Werkset.
Voeg een besturingselement Knop en een besturingselement Tekstvak toe aan het Venster MainWindow .
Markeer het besturingselement Tekstvak en stel in het venster Eigenschappen de volgende waarden in:
Stel de eigenschap Name in op
resultsTextBox
.Stel de eigenschap Height in op 250.
Stel de eigenschap Width in op 500.
Geef op het tabblad Tekst een monoruimtelettertype op, zoals Lucida Console of Global Monospace.
Markeer het besturingselement Knop en stel in het venster Eigenschappen de volgende waarden in:
Stel de eigenschap Name in op
startButton
.Wijzig de waarde van de eigenschap Inhoud van Knop in Start.
Plaats het tekstvak en de knop zodanig dat beide worden weergegeven in het Venster MainWindow .
Zie Een gebruikersinterface maken met behulp van XAML Designer voor meer informatie over de WPF XAML Designer.
Een verwijzing toevoegen
Markeer in Solution Explorer de naam van uw project.
Kies In de menubalk Project, Verwijzing toevoegen.
Het dialoogvenster Reference Manager wordt weergegeven.
Controleer boven aan het dialoogvenster of uw project gericht is op .NET Framework 4.5 of hoger.
Kies Framework in het gebied Assembly's als dit nog niet is gekozen.
Schakel in de lijst met namen het selectievakje System.Net.Http in.
Kies de knop OK om het dialoogvenster te sluiten.
Benodigde importinstructies toevoegen
Open in Solution Explorer het snelmenu voor MainWindow.xaml.vb en kies Code weergeven.
Voeg de volgende
Imports
instructies toe boven aan het codebestand als deze nog niet aanwezig zijn.Imports System.Net.Http Imports System.Net Imports System.IO
Een synchrone toepassing maken
Dubbelklik in het ontwerpvenster MainWindow.xaml op de knop Start om de
startButton_Click
gebeurtenis-handler in MainWindow.xaml.vb te maken.Kopieer in MainWindow.xaml.vb de volgende code naar de hoofdtekst van
startButton_Click
:resultsTextBox.Clear() SumPageSizes() resultsTextBox.Text &= vbCrLf & "Control returned to startButton_Click."
De code roept de methode aan waarmee de toepassing
SumPageSizes
wordt aangeroepen en geeft een bericht weer wanneer het besturingselement terugkeert naarstartButton_Click
.De code voor de synchrone oplossing bevat de volgende vier methoden:
SumPageSizes
, waarmee een lijst met webpagina-URL's wordt opgehaald vanSetUpURLList
en vervolgens wordt aangeroepenGetURLContents
enDisplayResults
elke URL verwerkt.SetUpURLList
, die een lijst met webadressen maakt en retourneert.GetURLContents
, waarmee de inhoud van elke website wordt gedownload en de inhoud wordt geretourneerd als een bytematrix.DisplayResults
, waarmee het aantal bytes in de bytematrix voor elke URL wordt weergegeven.
Kopieer de volgende vier methoden en plak deze onder de
startButton_Click
gebeurtenis-handler in MainWindow.xaml.vb:Private Sub SumPageSizes() ' Make a list of web addresses. Dim urlList As List(Of String) = SetUpURLList() Dim total = 0 For Each url In urlList ' GetURLContents returns the contents of url as a byte array. Dim urlContents As Byte() = GetURLContents(url) DisplayResults(url, urlContents) ' Update the total. total += urlContents.Length Next ' Display the total count for all of the web addresses. resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf & "Total bytes returned: {0}" & vbCrLf, total) End Sub Private Function SetUpURLList() As List(Of String) Dim urls = New List(Of String) From { "https://msdn.microsoft.com/library/windows/apps/br211380.aspx", "https://msdn.microsoft.com", "https://msdn.microsoft.com/library/hh290136.aspx", "https://msdn.microsoft.com/library/ee256749.aspx", "https://msdn.microsoft.com/library/hh290138.aspx", "https://msdn.microsoft.com/library/hh290140.aspx", "https://msdn.microsoft.com/library/dd470362.aspx", "https://msdn.microsoft.com/library/aa578028.aspx", "https://msdn.microsoft.com/library/ms404677.aspx", "https://msdn.microsoft.com/library/ff730837.aspx" } Return urls End Function Private Function GetURLContents(url As String) As Byte() ' The downloaded resource ends up in the variable named content. Dim content = New MemoryStream() ' Initialize an HttpWebRequest for the current URL. Dim webReq = CType(WebRequest.Create(url), HttpWebRequest) ' Send the request to the Internet resource and wait for ' the response. ' Note: you can't use HttpWebRequest.GetResponse in a Windows Store app. Using response As WebResponse = webReq.GetResponse() ' Get the data stream that is associated with the specified URL. Using responseStream As Stream = response.GetResponseStream() ' Read the bytes in responseStream and copy them to content. responseStream.CopyTo(content) End Using End Using ' Return the result as a byte array. Return content.ToArray() End Function Private Sub DisplayResults(url As String, content As Byte()) ' Display the length of each website. The string format ' is designed to be used with a monospaced font, such as ' Lucida Console or Global Monospace. Dim bytes = content.Length ' Strip off the "https://". Dim displayURL = url.Replace("https://", "") resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes) End Sub
De synchrone oplossing testen
Kies de F5-toets om het programma uit te voeren en kies vervolgens de knop Start .
Uitvoer die lijkt op de volgende lijst, moet worden weergegeven:
msdn.microsoft.com/library/windows/apps/br211380.aspx 383832 msdn.microsoft.com 33964 msdn.microsoft.com/library/hh290136.aspx 225793 msdn.microsoft.com/library/ee256749.aspx 143577 msdn.microsoft.com/library/hh290138.aspx 237372 msdn.microsoft.com/library/hh290140.aspx 128279 msdn.microsoft.com/library/dd470362.aspx 157649 msdn.microsoft.com/library/aa578028.aspx 204457 msdn.microsoft.com/library/ms404677.aspx 176405 msdn.microsoft.com/library/ff730837.aspx 143474 Total bytes returned: 1834802 Control returned to startButton_Click.
U ziet dat het enkele seconden duurt om de aantallen weer te geven. Gedurende die tijd wordt de UI-thread geblokkeerd terwijl wordt gewacht tot de aangevraagde resources zijn gedownload. Als gevolg hiervan kunt u het weergavevenster niet verplaatsen, maximaliseren, minimaliseren of zelfs sluiten nadat u de knop Start hebt gekozen. Deze pogingen mislukken totdat de byteaantallen worden weergegeven. Als een website niet reageert, hebt u geen indicatie van welke site is mislukt. Het is moeilijk om te stoppen met wachten en het programma te sluiten.
GetURLContents converteren naar een asynchrone methode
Als u de synchrone oplossing wilt converteren naar een asynchrone oplossing, kunt
GetURLContents
u het beste beginnen omdat de aanroepen naar de HttpWebRequest.GetResponse methode en de Stream.CopyTo methode de locatie zijn waar de toepassing toegang heeft tot het web. Het .NET Framework maakt de conversie eenvoudig door asynchrone versies van beide methoden op te leveren.Zie voor meer informatie over de methoden die worden gebruikt in
GetURLContents
WebRequest.Notitie
Terwijl u de stappen in dit scenario volgt, worden er verschillende compilerfouten weergegeven. U kunt deze negeren en doorgaan met het scenario.
Wijzig de methode die wordt aangeroepen in de derde regel van
GetURLContents
naarGetResponse
de asynchrone, taakgebaseerde GetResponseAsync methode.Using response As WebResponse = webReq.GetResponseAsync()
GetResponseAsync
geeft als resultaat een Task<TResult>. In dit geval heeft de variabele voor het retournerenTResult
van de taak het type WebResponse. De taak is een belofte om een werkelijkWebResponse
object te produceren nadat de aangevraagde gegevens zijn gedownload en de taak tot voltooiing is uitgevoerd.Als u de
WebResponse
waarde van de taak wilt ophalen, past u een await-operator toe op de aanroep,GetResponseAsync
zoals in de volgende code wordt weergegeven.Using response As WebResponse = Await webReq.GetResponseAsync()
De
Await
operator onderbreekt de uitvoering van de huidige methode,GetURLContents
totdat de wachtende taak is voltooid. Ondertussen keert het besturingselement terug naar de aanroeper van de huidige methode. In dit voorbeeld isGetURLContents
de huidige methode en de aanroeper .SumPageSizes
Wanneer de taak is voltooid, wordt het beloofdeWebResponse
object geproduceerd als de waarde van de wachtende taak en toegewezen aan de variabeleresponse
.De vorige instructie kan worden gescheiden in de volgende twee instructies om te verduidelijken wat er gebeurt.
Dim responseTask As Task(Of WebResponse) = webReq.GetResponseAsync() Using response As WebResponse = Await responseTask
De aanroep om
webReq.GetResponseAsync
eenTask(Of WebResponse)
ofTask<WebResponse>
. Vervolgens wordt eenAwait
operator toegepast op de taak om deWebResponse
waarde op te halen.Als uw asynchrone methode hiervoor niet afhankelijk is van de voltooiing van de taak, kan de methode doorgaan met dat werk tussen deze twee instructies, na de aanroep van de asynchrone methode en voordat de wachtoperator wordt toegepast. Zie Voor voorbeelden : Meerdere webaanvragen parallel maken met behulp van Async and Await (Visual Basic) en How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic).
Omdat u de
Await
operator in de vorige stap hebt toegevoegd, treedt er een compilerfout op. De operator kan alleen worden gebruikt in methoden die zijn gemarkeerd met de Asynchrone modifier. Negeer de fout terwijl u de conversiestappen herhaalt om de aanroep teCopyTo
vervangen door een aanroep naarCopyToAsync
.Wijzig de naam van de methode die wordt aangeroepen CopyToAsync.
De
CopyTo
ofCopyToAsync
methode kopieert bytes naar het argumentcontent
en retourneert geen zinvolle waarde. In de synchrone versie is de aanroep naarCopyTo
een eenvoudige instructie die geen waarde retourneert. De asynchrone versie,CopyToAsync
retourneert een Task. De taakfuncties zoals 'Task(void)' en maken het mogelijk om de methode te wachten. PasAwait
ofawait
op de aanroep toe,CopyToAsync
zoals in de volgende code wordt weergegeven.Await responseStream.CopyToAsync(content)
In de vorige instructie worden de volgende twee regels code afgekort.
' CopyToAsync returns a Task, not a Task<T>. Dim copyTask As Task = responseStream.CopyToAsync(content) ' When copyTask is completed, content contains a copy of ' responseStream. Await copyTask
U hoeft alleen maar
GetURLContents
de handtekening van de methode aan te passen. U kunt deAwait
operator alleen gebruiken in methoden die zijn gemarkeerd met de Asynchrone modifier. Voeg de wijzigingsfunctie toe om de methode als asynchrone methode te markeren, zoals in de volgende code wordt weergegeven.Private Async Function GetURLContents(url As String) As Byte()
Het retourtype van een asynchrone methode kan alleen zijn Task, Task<TResult>. In Visual Basic moet de methode een
Function
methode zijn die eenTask
of eenTask(Of T)
, of de methode moet eenSub
. Normaal gesproken wordt eenSub
methode alleen gebruikt in een asynchrone gebeurtenis-handler, waarSub
dat nodig is. In andere gevallen gebruiktTask(T)
u als de voltooide methode een Return-instructie heeft die een waarde van het type T retourneert en u gebruiktTask
als de voltooide methode geen zinvolle waarde retourneert.Zie Asynchrone retourtypen (Visual Basic) voor meer informatie.
De methode
GetURLContents
heeft een retourinstructie en de instructie retourneert een bytematrix. Daarom is het retourtype van de asynchrone versie Taak (T), waarbij T een bytematrix is. Breng de volgende wijzigingen aan in de methodehandtekening:Wijzig het retourtype in
Task(Of Byte())
.Volgens de conventie hebben asynchrone methoden namen die eindigen op 'Async', dus wijzig de naam van de methode
GetURLContentsAsync
.
In de volgende code worden deze wijzigingen weergegeven.
Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())
Met deze paar wijzigingen is de conversie van
GetURLContents
een asynchrone methode voltooid.
SumPageSizes converteren naar een asynchrone methode
Herhaal de stappen uit de vorige procedure voor
SumPageSizes
. Wijzig eerst de aanroep inGetURLContents
een asynchrone aanroep.Wijzig de naam van de methode die wordt aangeroepen in
GetURLContents
GetURLContentsAsync
, als u dit nog niet hebt gedaan.Toepassen
Await
op de taak dieGetURLContentsAsync
wordt geretourneerd om de bytematrixwaarde te verkrijgen.
In de volgende code worden deze wijzigingen weergegeven.
Dim urlContents As Byte() = Await GetURLContentsAsync(url)
Met de vorige toewijzing worden de volgende twee regels code afgekort.
' GetURLContentsAsync returns a task. At completion, the task ' produces a byte array. Dim getContentsTask As Task(Of Byte()) = GetURLContentsAsync(url) Dim urlContents As Byte() = Await getContentsTask
Breng de volgende wijzigingen aan in de handtekening van de methode:
Markeer de methode met de
Async
wijzigingsfunctie.Voeg Async toe aan de naam van de methode.
Er is geen variabele voor het retourneren van taken, T, deze keer omdat
SumPageSizesAsync
er geen waarde voor T wordt geretourneerd. (De methode heeft geenReturn
instructie.) De methode moet echter wordenTask
geretourneerd om te wachten. Wijzig daarom het methodetype vanSub
inFunction
. Het retourtype van de functie isTask
.
In de volgende code worden deze wijzigingen weergegeven.
Private Async Function SumPageSizesAsync() As Task
De conversie van
SumPageSizes
naarSumPageSizesAsync
is voltooid.
StartButton_Click converteren naar een asynchrone methode
Wijzig in de gebeurtenishandler de naam van de aangeroepen methode van
SumPageSizes
inSumPageSizesAsync
, als u dit nog niet hebt gedaan.Omdat
SumPageSizesAsync
dit een asynchrone methode is, wijzigt u de code in de gebeurtenis-handler om het resultaat te wachten.De aanroep om de oproep naar binnen
GetURLContentsAsync
teSumPageSizesAsync
CopyToAsync
spiegelen. De aanroep retourneert eenTask
, niet eenTask(T)
.Net als in eerdere procedures kunt u de aanroep converteren met behulp van één instructie of twee instructies. In de volgende code worden deze wijzigingen weergegeven.
' One-step async call. Await SumPageSizesAsync() ' Two-step async call. Dim sumTask As Task = SumPageSizesAsync() Await sumTask
Als u wilt voorkomen dat de bewerking per ongeluk opnieuw wordt verzonden, voegt u de volgende instructie toe bovenaan
startButton_Click
om de knop Start uit te schakelen.' Disable the button until the operation is complete. startButton.IsEnabled = False
U kunt de knop aan het einde van de gebeurtenis-handler opnieuw activeren.
' Reenable the button in case you want to run the operation again. startButton.IsEnabled = True
Zie Reentrancy verwerken in Async Apps (Visual Basic) voor meer informatie over reentrancy.
Voeg tot slot de
Async
wijziging toe aan de declaratie, zodat de gebeurtenis-handler kan wachtenSumPagSizesAsync
.Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
Normaal gesproken worden de namen van gebeurtenis-handlers niet gewijzigd. Het retourtype wordt niet gewijzigd
Task
omdat gebeurtenis-handlers procedures moeten zijnSub
in Visual Basic.De conversie van het project van synchrone naar asynchrone verwerking is voltooid.
De asynchrone oplossing testen
Kies de F5-toets om het programma uit te voeren en kies vervolgens de knop Start .
Uitvoer die lijkt op de uitvoer van de synchrone oplossing, moet worden weergegeven. Let echter op de volgende verschillen.
De resultaten komen niet allemaal tegelijk voor, nadat de verwerking is voltooid. Beide programma's bevatten bijvoorbeeld een regel in
startButton_Click
het tekstvak. De bedoeling is om het tekstvak tussen uitvoeringen te wissen als u de knop Start voor een tweede keer kiest, nadat één set resultaten is weergegeven. In de synchrone versie wordt het tekstvak gewist vlak voordat de tellingen voor de tweede keer worden weergegeven, wanneer de downloads zijn voltooid en de UI-thread gratis is om ander werk te doen. In de asynchrone versie wordt het tekstvak direct gewist nadat u de knop Start hebt gekozen.Het belangrijkste is dat de UI-thread niet wordt geblokkeerd tijdens de downloads. U kunt het venster verplaatsen of het formaat ervan wijzigen terwijl de webresources worden gedownload, geteld en weergegeven. Als een van de websites traag of niet reageert, kunt u de bewerking annuleren door de knop Sluiten te kiezen (de x in het rode veld in de rechterbovenhoek).
Vervang de methode GetURLContentsAsync door een .NET Framework-methode
Het .NET Framework biedt veel asynchrone methoden die u kunt gebruiken. Een van hen, de HttpClient.GetByteArrayAsync(String) methode, doet precies wat u nodig hebt voor dit scenario. U kunt deze gebruiken in plaats van de
GetURLContentsAsync
methode die u in een eerdere procedure hebt gemaakt.De eerste stap is het maken van een HttpClient object in de
SumPageSizesAsync
methode. Voeg de volgende declaratie toe aan het begin van de methode.' Declare an HttpClient object and increase the buffer size. The ' default buffer size is 65,536. Dim client As HttpClient = New HttpClient() With {.MaxResponseContentBufferSize = 1000000}
Vervang
SumPageSizesAsync
de aanroep naar uwGetURLContentsAsync
methode door een aanroep naar deHttpClient
methode.Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
Verwijder of markeer de
GetURLContentsAsync
methode die u hebt geschreven.Kies de F5-toets om het programma uit te voeren en kies vervolgens de knop Start .
Het gedrag van deze versie van het project moet overeenkomen met het gedrag dat de procedure 'De asynchrone oplossing testen' beschrijft, maar met nog minder inspanning van u.
Opmerking
Hier volgt het volledige voorbeeld van de geconverteerde asynchrone oplossing die gebruikmaakt van de asynchrone GetURLContentsAsync
methode. U ziet dat deze sterk lijkt op de oorspronkelijke, synchrone oplossing.
' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http
Imports System.Net
Imports System.IO
Class MainWindow
Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
' Disable the button until the operation is complete.
startButton.IsEnabled = False
resultsTextBox.Clear()
'' One-step async call.
Await SumPageSizesAsync()
' Two-step async call.
'Dim sumTask As Task = SumPageSizesAsync()
'Await sumTask
resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
' Reenable the button in case you want to run the operation again.
startButton.IsEnabled = True
End Sub
Private Async Function SumPageSizesAsync() As Task
' Make a list of web addresses.
Dim urlList As List(Of String) = SetUpURLList()
Dim total = 0
For Each url In urlList
Dim urlContents As Byte() = Await GetURLContentsAsync(url)
' The previous line abbreviates the following two assignment statements.
'//<snippet21>
' GetURLContentsAsync returns a task. At completion, the task
' produces a byte array.
'Dim getContentsTask As Task(Of Byte()) = GetURLContentsAsync(url)
'Dim urlContents As Byte() = Await getContentsTask
DisplayResults(url, urlContents)
' Update the total.
total += urlContents.Length
Next
' Display the total count for all of the websites.
resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
"Total bytes returned: {0}" & vbCrLf, total)
End Function
Private Function SetUpURLList() As List(Of String)
Dim urls = New List(Of String) From
{
"https://msdn.microsoft.com/library/windows/apps/br211380.aspx",
"https://msdn.microsoft.com",
"https://msdn.microsoft.com/library/hh290136.aspx",
"https://msdn.microsoft.com/library/ee256749.aspx",
"https://msdn.microsoft.com/library/hh290138.aspx",
"https://msdn.microsoft.com/library/hh290140.aspx",
"https://msdn.microsoft.com/library/dd470362.aspx",
"https://msdn.microsoft.com/library/aa578028.aspx",
"https://msdn.microsoft.com/library/ms404677.aspx",
"https://msdn.microsoft.com/library/ff730837.aspx"
}
Return urls
End Function
Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())
' The downloaded resource ends up in the variable named content.
Dim content = New MemoryStream()
' Initialize an HttpWebRequest for the current URL.
Dim webReq = CType(WebRequest.Create(url), HttpWebRequest)
' Send the request to the Internet resource and wait for
' the response.
Using response As WebResponse = Await webReq.GetResponseAsync()
' The previous statement abbreviates the following two statements.
'Dim responseTask As Task(Of WebResponse) = webReq.GetResponseAsync()
'Using response As WebResponse = Await responseTask
' Get the data stream that is associated with the specified URL.
Using responseStream As Stream = response.GetResponseStream()
' Read the bytes in responseStream and copy them to content.
Await responseStream.CopyToAsync(content)
' The previous statement abbreviates the following two statements.
' CopyToAsync returns a Task, not a Task<T>.
'Dim copyTask As Task = responseStream.CopyToAsync(content)
' When copyTask is completed, content contains a copy of
' responseStream.
'Await copyTask
End Using
End Using
' Return the result as a byte array.
Return content.ToArray()
End Function
Private Sub DisplayResults(url As String, content As Byte())
' Display the length of each website. The string format
' is designed to be used with a monospaced font, such as
' Lucida Console or Global Monospace.
Dim bytes = content.Length
' Strip off the "https://".
Dim displayURL = url.Replace("https://", "")
resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes)
End Sub
End Class
De volgende code bevat het volledige voorbeeld van de oplossing die gebruikmaakt van de HttpClient
methode. GetByteArrayAsync
' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http
Imports System.Net
Imports System.IO
Class MainWindow
Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
resultsTextBox.Clear()
' Disable the button until the operation is complete.
startButton.IsEnabled = False
' One-step async call.
Await SumPageSizesAsync()
' Two-step async call.
'Dim sumTask As Task = SumPageSizesAsync()
'Await sumTask
resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
' Reenable the button in case you want to run the operation again.
startButton.IsEnabled = True
End Sub
Private Async Function SumPageSizesAsync() As Task
' Declare an HttpClient object and increase the buffer size. The
' default buffer size is 65,536.
Dim client As HttpClient =
New HttpClient() With {.MaxResponseContentBufferSize = 1000000}
' Make a list of web addresses.
Dim urlList As List(Of String) = SetUpURLList()
Dim total = 0
For Each url In urlList
' GetByteArrayAsync returns a task. At completion, the task
' produces a byte array.
Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
' The following two lines can replace the previous assignment statement.
'Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
'Dim urlContents As Byte() = Await getContentsTask
DisplayResults(url, urlContents)
' Update the total.
total += urlContents.Length
Next
' Display the total count for all of the websites.
resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
"Total bytes returned: {0}" & vbCrLf, total)
End Function
Private Function SetUpURLList() As List(Of String)
Dim urls = New List(Of String) From
{
"https://msdn.microsoft.com/library/windows/apps/br211380.aspx",
"https://msdn.microsoft.com",
"https://msdn.microsoft.com/library/hh290136.aspx",
"https://msdn.microsoft.com/library/ee256749.aspx",
"https://msdn.microsoft.com/library/hh290138.aspx",
"https://msdn.microsoft.com/library/hh290140.aspx",
"https://msdn.microsoft.com/library/dd470362.aspx",
"https://msdn.microsoft.com/library/aa578028.aspx",
"https://msdn.microsoft.com/library/ms404677.aspx",
"https://msdn.microsoft.com/library/ff730837.aspx"
}
Return urls
End Function
Private Sub DisplayResults(url As String, content As Byte())
' Display the length of each website. The string format
' is designed to be used with a monospaced font, such as
' Lucida Console or Global Monospace.
Dim bytes = content.Length
' Strip off the "https://".
Dim displayURL = url.Replace("https://", "")
resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes)
End Sub
End Class
Zie ook
- Async-voorbeeld: toegang tot het web-overzicht (C# en Visual Basic)
- Wacht op operator
- Async
- Asynchrone programmering met Async en Await (Visual Basic)
- Asynchrone retourtypen (Visual Basic)
- Asynchrone programmering op basis van taken (TAP)
- Procedure: Het overzicht van Async uitbreiden met behulp van Task.WhenAll (Visual Basic)
- Procedure: Meerdere webaanvragen parallel maken met behulp van Async en Await (Visual Basic)