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:
- Vytvoření aplikace WPF
- Návrh jednoduchého WPF MainWindow
- Přidání odkazu
- Přidání nezbytných příkazů Imports
- Vytvoření synchronní aplikace
- Testování synchronního řešení
- Převod GetURLContents na asynchronní metodu
- Převod SumPageSizes na asynchronní metodu
- Převod startButton_Click na asynchronní metodu
- Testování asynchronního řešení
- Nahraďte metodu GetURLContentsAsync metodou rozhraní .NET Framework.
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
Spusťte Visual Studio.
Na řádku nabídek zvolte Soubor, Nový, Projekt.
Otevře se dialogové okno Nový projekt .
V podokně Nainstalované šablony zvolte Visual Basic a pak v seznamu typů projektů zvolte Aplikaci WPF.
Do textového pole Název zadejte
AsyncExampleWPF
a pak zvolte tlačítko OK .Nový projekt se zobrazí v Průzkumník řešení.
Návrh jednoduchého WPF MainWindow
V editoru Visual Studio Code zvolte kartu MainWindow.xaml .
Pokud okno Panel nástrojů není viditelné, otevřete nabídku Zobrazení a pak zvolte Panel nástrojů.
Přidání ovládacího prvku Button a ovládacího prvku TextBox do okna MainWindow
Zvýrazněte ovládací prvek TextBox a v okně Vlastnosti nastavte následující hodnoty:
Nastavte vlastnost Name na
resultsTextBox
hodnotu .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.
Zvýrazněte ovládací prvek Tlačítko a v okně Vlastnosti nastavte následující hodnoty:
Nastavte vlastnost Name na
startButton
hodnotu .Změňte hodnotu vlastnosti Content z tlačítka na Start.
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
V Průzkumník řešení zvýrazněte název projektu.
Na řádku nabídek zvolte Projekt, Přidat odkaz.
Zobrazí se dialogové okno Správce odkazů.
V horní části dialogového okna ověřte, že váš projekt cílí na rozhraní .NET Framework 4.5 nebo vyšší.
V oblasti Sestavení zvolte Rozhraní, pokud ještě není zvoleno.
V seznamu názvů zaškrtněte políčko System.Net.Http .
Kliknutím na tlačítko OK zavřete dialogové okno.
Přidání nezbytných příkazů Imports
V Průzkumník řešení otevřete místní nabídku pro MainWindow.xaml.vb a pak zvolte Zobrazit kód.
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
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.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,
SumPageSizes
a zobrazí zprávu při návratu ovládacího prvku .startButton_Click
Kód synchronního řešení obsahuje následující čtyři metody:
SumPageSizes
, který získá seznam adres URL webové stránky odSetUpURLList
a potom voláGetURLContents
aDisplayResults
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í
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
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
GetURLContents
WebRequestPozná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
zGetResponse
asynchronní metody založené na GetResponseAsync úlohách.Using response As WebResponse = webReq.GetResponseAsync()
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 ,GetURLContents
až 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 jeGetURLContents
aktuální metoda a volající jeSumPageSizes
. 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í neboTask(Of WebResponse)
Task<WebResponse>
. Potom seAwait
na úkol použije operátor, který načteWebResponse
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).
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 hovorCopyTo
nahradili volánímCopyToAsync
.Změňte název metody, která je volána na CopyToAsync.
CopyTo
NeboCopyToAsync
metoda zkopíruje bajty do argumentucontent
a nevrací smysluplnou hodnotu. V synchronní verzi je voláníCopyTo
jednoduchého příkazu, který nevrací hodnotu. Asynchronní verze ,CopyToAsync
vrátí hodnotu Task. Úloha funguje jako Task(void) a umožňuje, aby byla metoda očekávána. PoužítAwait
neboawait
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
Jediné, co zbývá udělat
GetURLContents
, je upravit podpis metody. Operátor můžete použítAwait
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()
Návratový typ asynchronní metody může být Taskpouze , Task<TResult>. V jazyce Visual Basic musí být
Function
metoda, která vrací neboTask
,Task(Of T)
nebo metoda musí být .Sub
Sub
Metoda se obvykle používá pouze v asynchronní obslužné rutině události, kdeSub
je vyžadována. V jiných případech použijeteTask(T)
, pokud dokončená metoda obsahuje příkaz Return , který vrací hodnotu typu T, a použijeteTask
, 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
GetURLContentsAsync
př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
Opakujte kroky z předchozího postupu pro
SumPageSizes
. Nejprve změňte volání naGetURLContents
asynchronní volání.Pokud jste to ještě neudělali, změňte název metody, ze které se volá
GetURLContents
GetURLContentsAsync
.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
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átitTask
, aby byla očekávaná. Proto změňte typ metody zSub
naFunction
. Návratový typ funkce jeTask
.
Následující kód ukazuje tyto změny.
Private Async Function SumPageSizesAsync() As Task
Převod
SumPageSizes
naSumPageSizesAsync
dokončení.
Převod startButton_Click na asynchronní metodu
V obslužné rutině události změňte název volané metody z
SumPageSizes
naSumPageSizesAsync
, pokud jste to ještě neudělali.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í doCopyToAsync
GetURLContentsAsync
. Volání vrátí ,Task
neTask(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
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).
Nakonec do deklarace přidejte
Async
modifikátor tak, aby obslužná rutina události mohl očekávatSumPagSizesAsync
.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ýtSub
procedury v jazyce Visual Basic.Převod projektu z synchronního na asynchronní zpracování je dokončený.
Testování asynchronního řešení
Zvolte klávesu F5, aby se program spustil, a pak zvolte tlačítko Start .
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.
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}
Nahraďte
SumPageSizesAsync
volání metodyGetURLContentsAsync
volánímHttpClient
metody.Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
Odeberte nebo okomentujte metodu
GetURLContentsAsync
, kterou jste napsali.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é
- Asynchronní ukázka: Přístup k webovému návodu (C# a Visual Basic)
- Operátor Await
- Async
- Asynchronní programování pomocí Async a Await (Visual Basic)
- Asynchronní návratové typy (Visual Basic)
- Asynchronní programování založené na úlohách (TAP)
- Postupy: Rozšíření návodu Async pomocí task.WhenAll (Visual Basic)
- Postupy: Paralelní provádění více webových požadavků pomocí Async a Await (Visual Basic)