İzlenecek yol: Async ve Await Kullanarak Web'e Erişme (Visual Basic)
Zaman uyumsuz/await özelliklerini kullanarak zaman uyumsuz programları daha kolay ve sezgisel bir şekilde yazabilirsiniz. Zaman uyumlu kod gibi görünen zaman uyumsuz kod yazabilir ve derleyicinin genellikle zaman uyumsuz kodun gerektirdiği zor geri çağırma işlevlerini ve devamlılıklarını işlemesine izin vekleyebilirsiniz.
Zaman Uyumsuz özelliği hakkında daha fazla bilgi için bkz . Async ve Await (Visual Basic) ile Zaman Uyumsuz Programlama.
Bu izlenecek yol, web siteleri listesindeki bayt sayısını toplayan zaman uyumlu bir Windows Presentation Foundation (WPF) uygulamasıyla başlar. İzlenecek yol daha sonra yeni özellikleri kullanarak uygulamayı zaman uyumsuz bir çözüme dönüştürür.
İzlenecek yolu tamamlayarak veya örneği .NET Sample Browser'dan indirerek uygulamaları geliştirebilirsiniz. Örnek kod SerialAsyncExample projesindedir.
Bu kılavuzda aşağıdaki görevleri tamamlaacaksınız:
- WPF uygulaması oluşturma
- Basit bir WPF MainWindow tasarlama
- Başvuru ekleme
- Gerekli Imports deyimlerini ekleme
- Zaman uyumlu uygulama oluşturma
- Zaman uyumlu çözümü test etme
- GetURLContents'i zaman uyumsuz bir yönteme dönüştürme
- SumPageSizes'i zaman uyumsuz bir yönteme dönüştürme
- startButton_Click zaman uyumsuz bir yönteme dönüştürme
- Zaman uyumsuz çözümü test edin
- GetURLContentsAsync yöntemini bir .NET Framework yöntemiyle değiştirin
Tam zaman uyumsuz örnek için Örnek bölümüne bakın.
Önkoşullar
Visual Studio 2012 veya üzeri bilgisayarınızda yüklü olmalıdır. Daha fazla bilgi için Visual Studio İndirmeleri sayfasına bakın.
WPF uygulaması oluşturma
Visual Studio’yu çalıştırın.
Menü çubuğunda Dosya, Yeni, Proje'yi seçin.
Yeni Proje iletişim kutusu açılır.
Yüklü Şablonlar bölmesinde Visual Basic'i ve ardından proje türleri listesinden WPF Uygulaması'nı seçin.
Ad metin kutusuna yazın
AsyncExampleWPF
ve Tamam düğmesini seçin.Yeni proje Çözüm Gezgini görüntülenir.
Basit bir WPF MainWindow tasarlama
Visual Studio Code Düzenleyicisi'nde MainWindow.xaml sekmesini seçin.
Araç Kutusu penceresi görünmüyorsa Görünüm menüsünü açın ve Araç Kutusu'nu seçin.
MainWindow penceresine Düğme denetimi ve TextBox denetimi ekleyin.
TextBox denetimini vurgulayın ve Özellikler penceresinde aşağıdaki değerleri ayarlayın:
Name özelliğini olarak
resultsTextBox
ayarlayın.Height özelliğini 250 olarak ayarlayın.
Width özelliğini 500 olarak ayarlayın.
Metin sekmesinde Lucida Konsolu veya Genel Monospace gibi tek aralıklı bir yazı tipi belirtin.
Düğme denetimini vurgulayın ve Özellikler penceresinde aşağıdaki değerleri ayarlayın:
Name özelliğini olarak
startButton
ayarlayın.content özelliğinin değerini Düğmeolan Başlangıç olarak değiştirin.
Her ikisinin de MainWindow penceresinde görünmesi için metin kutusunu ve düğmeyi konumlandırın.
WPF XAML Tasarım Aracı hakkında daha fazla bilgi için bkz. XAML Tasarım Aracı kullanarak kullanıcı arabirimi oluşturma.
Başvuru ekleme
Çözüm Gezgini'de projenizin adını vurgulayın.
Menü çubuğunda Proje, Başvuru Ekle'yi seçin.
Başvuru Yöneticisi iletişim kutusu görüntülenir.
İletişim kutusunun üst kısmında projenizin .NET Framework 4.5 veya üstünü hedeflediğini doğrulayın.
Derlemeler alanında, henüz seçilmediyse Çerçeve'yi seçin.
Ad listesinde System.Net.Http onay kutusunu seçin.
İletişim kutusunu kapatmak için Tamam düğmesini seçin.
Gerekli Imports deyimlerini ekleme
Çözüm Gezgini'da, MainWindow.xaml.vb kısayol menüsünü açın ve kodu görüntüle'yi seçin.
Henüz yoksa kod dosyasının en üstüne aşağıdaki
Imports
deyimleri ekleyin.Imports System.Net.Http Imports System.Net Imports System.IO
Zaman uyumlu uygulama oluşturma
MainWindow.xaml tasarım penceresinde Başlat düğmesine çift tıklayarak MainWindow.xaml.vb olay işleyicisini
startButton_Click
oluşturun.MainWindow.xaml.vb aşağıdaki kodu gövdesine
startButton_Click
kopyalayın:resultsTextBox.Clear() SumPageSizes() resultsTextBox.Text &= vbCrLf & "Control returned to startButton_Click."
Kod,
SumPageSizes
uygulamasını çalıştıran yöntemini çağırır ve denetim öğesine döndüğündestartButton_Click
bir ileti görüntüler.Zaman uyumlu çözümün kodu aşağıdaki dört yöntemi içerir:
SumPageSizes
, web sayfası URL'lerininSetUpURLList
listesini alır ve ardından her URL'yi işleyip çağırırGetURLContents
DisplayResults
.SetUpURLList
, web adreslerinin listesini oluşturur ve döndürür.GetURLContents
, her web sitesinin içeriğini indirir ve içeriği bayt dizisi olarak döndürür.DisplayResults
, her URL için bayt dizisindeki bayt sayısını görüntüler.
Aşağıdaki dört yöntemi kopyalayın ve MainWindow.xaml.vb'da olay işleyicisinin
startButton_Click
altına yapıştırın: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
Zaman uyumlu çözümü test etme
Programı çalıştırmak için F5 tuşunu seçin ve ardından Başlat düğmesini seçin.
Aşağıdaki listeye benzer bir çıkış görünmelidir:
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.
Sayıların görüntülenmesinin birkaç saniye sürdüğüne dikkat edin. Bu süre boyunca kullanıcı arabirimi iş parçacığı, istenen kaynakların indirilmesini beklerken engellenir. Sonuç olarak, Başlat düğmesini seçtikten sonra görüntü penceresini taşıyamazsınız, ekranı kaplayamaz, simge durumuna küçültemez veya hatta kapatamazsınız. Bayt sayıları görünmeye başlayana kadar bu çabalar başarısız olur. Bir web sitesi yanıt vermiyorsa, hangi sitenin başarısız olduğuna dair hiçbir göstergeniz yoktur. Beklemeyi durdurmak ve programı kapatmak bile zordur.
GetURLContents'i zaman uyumsuz bir yönteme dönüştürme
Zaman uyumlu çözümü zaman uyumsuz çözüme dönüştürmek için, başlatabileceğiniz en iyi yer, yöntemine ve yöntemine HttpWebRequest.GetResponse yapılan çağrıların uygulamanın web'e Stream.CopyTo eriştiği yer olmasıdır
GetURLContents
. .NET Framework, her iki yöntemin zaman uyumsuz sürümlerini sağlayarak dönüştürmeyi kolaylaştırır.içinde
GetURLContents
kullanılan yöntemler hakkında daha fazla bilgi için bkz WebRequest. .Not
Bu kılavuzdaki adımları izlediğinizde çeşitli derleyici hataları görüntülenir. Bunları yoksayabilir ve izlenecek yol ile devam edebilirsiniz.
öğesinin üçüncü satırında
GetURLContents
GetResponse
çağrılan yöntemini, zaman uyumsuz, görev tabanlı GetResponseAsync yönteme değiştirin.Using response As WebResponse = webReq.GetResponseAsync()
GetResponseAsync
bir Task<TResult>döndürür. Bu durumda, görev dönüş değişkeni türüneTResult
sahiptir WebResponse. Görev, istenen veriler indirildikten ve tamamlanmaya kadar çalıştırıldıktan sonra gerçekWebResponse
bir nesne üretmeye yönelik bir sözdür.Görevden değeri almak için çağrısına
WebResponse
GetResponseAsync
aşağıdaki kodda gösterildiği gibi bir Await işleci uygulayın.Using response As WebResponse = Await webReq.GetResponseAsync()
işleci
Await
,GetURLContents
beklenen görev tamamlanana kadar geçerli yöntemin yürütülmesini askıya alır. Bu arada, denetim geçerli yöntemin çağıranı döndürür. Bu örnekte geçerli yöntem ,GetURLContents
çağıran ise şeklindedirSumPageSizes
. Görev tamamlandığında, taahhüt edilenWebResponse
nesne, beklenen görevin değeri olarak oluşturulur ve değişkenineresponse
atanır.Ne olduğunu netleştirmek için önceki deyim aşağıdaki iki deyime ayrılabilir.
Dim responseTask As Task(Of WebResponse) = webReq.GetResponseAsync() Using response As WebResponse = Await responseTask
çağrısı
webReq.GetResponseAsync
veyaTask(Of WebResponse)
Task<WebResponse>
döndürür. Ardından, değeri almakWebResponse
için göreve birAwait
işleç uygulanır.Zaman uyumsuz yönteminizin, görevin tamamlanmasına bağlı olmayan bir işi yapması gerekiyorsa yöntem, zaman uyumsuz yönteme yapılan çağrıdan sonra ve await işleci uygulanmadan önce bu iki deyim arasında bu çalışmaya devam edebilir. Örnekler için bkz . How to: Make Multiple Web Requests in Parallel by Using Async and Await (Visual Basic) and How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic).
önceki adımda işlecini eklediğiniz
Await
için derleyici hatası oluşur. işleci yalnızca Zaman Uyumsuz değiştirici ile işaretlenmiş yöntemlerde kullanılabilir. dönüştürme adımlarını yinelerken hatasınıCopyTo
CopyToAsync
yoksayın.olarak adlandırılan CopyToAsyncyöntemin adını değiştirin.
CopyTo
veyaCopyToAsync
yöntemi baytlarıcontent
bağımsız değişkenine kopyalar ve anlamlı bir değer döndürmez. Zaman uyumlu sürümde çağrısıCopyTo
, değer döndürmeyen basit bir deyimdir. zaman uyumsuz sürümü birCopyToAsync
Taskdöndürür. Görev "Task(void)" gibi çalışır ve yöntemin beklenmesini sağlar. Aşağıdaki kodda gösterildiği gibi öğesine veyaawait
çağrısınaCopyToAsync
uygulayınAwait
.Await responseStream.CopyToAsync(content)
Önceki deyim aşağıdaki iki kod satırını kısaltmaktadır.
' 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
yapılacak tek şey
GetURLContents
yöntem imzasını ayarlamaktır. işleciniAwait
yalnızca Zaman Uyumsuz değiştirici ile işaretlenmiş yöntemlerde kullanabilirsiniz. Aşağıdaki kodda gösterildiği gibi yöntemi zaman uyumsuz bir yöntem olarak işaretlemek için değiştiriciyi ekleyin.Private Async Function GetURLContents(url As String) As Byte()
Zaman uyumsuz yöntemin dönüş türü yalnızca , Task<TResult>olabilirTask. Visual Basic'te, yöntemi veya
Function
döndürenTask
birTask(Of T)
veya yöntemi olmalıdırSub
. Genellikle birSub
yöntem yalnızca gerekli olanSub
zaman uyumsuz olay işleyicisinde kullanılır. Diğer durumlarda,Task(T)
tamamlanan yöntemin T türünde bir değer döndüren bir Return deyimi varsa kullanırsınız ve tamamlanan yöntem anlamlı bir değer döndürmezse kullanırsınızTask
.Daha fazla bilgi için bkz . Zaman Uyumsuz Dönüş Türleri (Visual Basic).
Yöntemin
GetURLContents
return deyimi vardır ve deyimi bir bayt dizisi döndürür. Bu nedenle, zaman uyumsuz sürümün dönüş türü Task(T), burada T bir bayt dizisidir. Yöntem imzasında aşağıdaki değişiklikleri yapın:Dönüş türünü olarak
Task(Of Byte())
değiştirin.Kural gereği, zaman uyumsuz yöntemlerin "Async" ile biten adları vardır, bu nedenle yöntemini
GetURLContentsAsync
yeniden adlandırın.
Aşağıdaki kodda bu değişiklikler gösterilmektedir.
Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())
Bu birkaç değişiklikle, zaman uyumsuz bir yönteme dönüştürme
GetURLContents
işlemi tamamlanır.
SumPageSizes'i zaman uyumsuz bir yönteme dönüştürme
için
SumPageSizes
önceki yordamdaki adımları yineleyin. İlk olarak, çağrıyıGetURLContents
zaman uyumsuz bir çağrı olarak değiştirin.henüz yapmadıysanız , olarak adlandırılan
GetURLContents
GetURLContentsAsync
yöntemin adını olarak değiştirin.Bayt dizisi değerini almak için döndüren
GetURLContentsAsync
göreve uygulayınAwait
.
Aşağıdaki kodda bu değişiklikler gösterilmektedir.
Dim urlContents As Byte() = Await GetURLContentsAsync(url)
Önceki atama aşağıdaki iki kod satırını kısaltmaktadır.
' 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
Yöntemin imzasında aşağıdaki değişiklikleri yapın:
yöntemini değiştirici ile
Async
işaretleyin.Yöntem adına "Async" ekleyin.
T için bir değer döndürmediğinden bu kez
SumPageSizesAsync
T adlı bir görev dönüş değişkeni yoktur. (Yöntemin deyimi yokturReturn
.) Ancak, yöntemi beklenebilir olması için döndürmelidirTask
. Bu nedenle, yöntem türünü olarakSub
Function
değiştirin. İşlevin dönüş türü şeklindedirTask
.
Aşağıdaki kodda bu değişiklikler gösterilmektedir.
Private Async Function SumPageSizesAsync() As Task
dönüştürme
SumPageSizes
SumPageSizesAsync
işlemi tamamlandı.
startButton_Click zaman uyumsuz bir yönteme dönüştürme
Olay işleyicisinde, henüz yapmadıysanız olarak adlandırılan yöntemin
SumPageSizes
SumPageSizesAsync
adını olarak değiştirin.Zaman
SumPageSizesAsync
uyumsuz bir yöntem olduğundan, sonucu beklemek için olay işleyicisindeki kodu değiştirin.çağrısı,
SumPageSizesAsync
içindeki çağrısınaCopyToAsync
GetURLContentsAsync
yansıtıyor. Çağrısı bir döndürürTask
, değilTask(T)
.Önceki yordamlarda olduğu gibi, bir veya iki deyim kullanarak çağrıyı dönüştürebilirsiniz. Aşağıdaki kodda bu değişiklikler gösterilmektedir.
' One-step async call. Await SumPageSizesAsync() ' Two-step async call. Dim sumTask As Task = SumPageSizesAsync() Await sumTask
İşlemin yanlışlıkla yeniden başlatılmasını önlemek için, Başlat düğmesini devre dışı bırakmak için üst
startButton_Click
kısmına aşağıdaki deyimi ekleyin.' Disable the button until the operation is complete. startButton.IsEnabled = False
Olay işleyicisinin sonundaki düğmeyi yeniden oluşturabilirsiniz.
' Reenable the button in case you want to run the operation again. startButton.IsEnabled = True
Yeniden giriş hakkında daha fazla bilgi için bkz . Zaman Uyumsuz Uygulamalarda Yeniden Giriş İşleme (Visual Basic).
Son olarak, olay işleyicisinin
Async
bekleyebilmesiSumPagSizesAsync
için değiştiriciyi bildirimine ekleyin.Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
Genellikle, olay işleyicilerinin adları değiştirilmez. Olay işleyicilerinin Visual Basic'te yordamlar olması
Sub
gerektiğinden dönüş türü olarak değiştirilmezTask
.Projenin zaman uyumlu olandan zaman uyumsuz işlemeye dönüştürülmesi tamamlandı.
Zaman uyumsuz çözümü test edin
Programı çalıştırmak için F5 tuşunu seçin ve ardından Başlat düğmesini seçin.
Zaman uyumlu çözümün çıkışına benzeyen bir çıkış görünmelidir. Ancak aşağıdaki farklılıklara dikkat edin.
İşlem tamamlandıktan sonra sonuçların tümü aynı anda gerçekleşmez. Örneğin, her iki program da
startButton_Click
içinde metin kutusunu temizleyen bir satır içerir. Amaç, bir sonuç kümesi göründükten sonra Başlangıç düğmesini ikinci kez seçerseniz çalıştırmalar arasındaki metin kutusunu temizlemektir. Zaman uyumlu sürümde, indirmeler tamamlandığında ve kullanıcı arabirimi iş parçacığı başka işler yapmak için serbest olduğunda, metin kutusu sayımlar ikinci kez görünmeden hemen önce temizlenir. Zaman uyumsuz sürümde, Başlat düğmesini seçtikten hemen sonra metin kutusu temizlenmiş durumdadır.En önemlisi, kullanıcı arabirimi iş parçacığı indirmeler sırasında engellenmez. Web kaynakları indirilirken, sayılırken ve görüntülenirken pencereyi taşıyabilir veya yeniden boyutlandırabilirsiniz. Web sitelerinden biri yavaşsa veya yanıt vermiyorsa Kapat düğmesini (sağ üst köşedeki kırmızı alandaki x işareti) seçerek işlemi iptal edebilirsiniz.
GetURLContentsAsync yöntemini bir .NET Framework yöntemiyle değiştirin
.NET Framework, kullanabileceğiniz birçok zaman uyumsuz yöntem sağlar. Bunlardan biri olan HttpClient.GetByteArrayAsync(String) yöntemi, bu izlenecek yol için tam olarak ihtiyacınız olanı yapar. Önceki bir yordamda
GetURLContentsAsync
oluşturduğunuz yöntem yerine bunu kullanabilirsiniz.İlk adım yönteminde bir HttpClient nesne oluşturmaktır
SumPageSizesAsync
. Yönteminin başlangıcına aşağıdaki bildirimi ekleyin.' 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}
içinde
SumPageSizesAsync,
yönteminizeGetURLContentsAsync
yapılan çağrıyı yöntemineHttpClient
yapılan bir çağrıyla değiştirin.Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
Yazdığınız yöntemi kaldırın veya açıklama satırı oluşturun
GetURLContentsAsync
.Programı çalıştırmak için F5 tuşunu seçin ve ardından Başlat düğmesini seçin.
Projenin bu sürümünün davranışı, "Zaman uyumsuz çözümü test etmek için" yordamının tanımladığı davranışla eşleşmelidir ancak sizden daha az çaba gösterilmelidir.
Örnek
Aşağıda, zaman uyumsuz yöntemi kullanan dönüştürülen zaman uyumsuz çözümün tam örneği verilmiştir GetURLContentsAsync
. Özgün, zaman uyumlu çözüme kesinlikle benzediğini fark edin.
' 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
Aşağıdaki kod, GetByteArrayAsync
yöntemini kullanan çözümün tam örneğini HttpClient
içerir.
' 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
Ayrıca bkz.
- Zaman Uyumsuz Örnek: Web İzlenecek Yolu'na Erişme (C# ve Visual Basic)
- Await İşleci
- Async
- Async ve Await ile Zaman Uyumsuz Programlama (Visual Basic)
- Zaman Uyumsuz Dönüş Türleri (Visual Basic)
- Görev Tabanlı Zaman Uyumsuz Programlama (TAP)
- Nasıl yapılır: Task.WhenAll Kullanarak Zaman Uyumsuz İzlenecek Yolu Genişletme (Visual Basic)
- Nasıl yapılır: Async ve Await Kullanarak Birden Çok Web İsteğini Paralel Yapma (Visual Basic)