İzlenecek yol: Async ve await kullanarak Web 'e erişme (Visual Basic)
Zaman uyumsuz programları, zaman uyumsuz/await özelliklerini kullanarak daha kolay ve daha canlı bir şekilde yazabilirsiniz. Zaman uyumlu kod gibi görünen zaman uyumsuz kod yazabilir ve derleyicinin zaman uyumsuz kodun genellikle sahip olduğu zor geri çağırma işlevlerini ve devamlılığını işlemesini sağlayabilirsiniz.
Async özelliği hakkında daha fazla bilgi için bkz. zaman uyumsuz programlama, Async ve await (Visual Basic).
bu izlenecek yol, bir web sitesi listesindeki bayt sayısını toplayan bir zaman uyumlu Windows Presentation Foundation (WPF) uygulamasıyla başlar. İzlenecek yol, yeni özellikleri kullanarak uygulamayı zaman uyumsuz bir çözüme dönüştürür.
Geliştirme işlemini tamamlayarak veya örneği .NET örnek tarayıcısındanindirerek uygulamaları geliştirebilirsiniz. Örnek kod, Serialasyncexample projesinde bulunur.
Bu kılavuzda, aşağıdaki görevleri tamamlayadınız:
- WPF uygulaması oluşturma
- Basit bir WPF MainWindow tasarımı
- Başvuru ekleme
- Gerekli Imports deyimlerini Ekle
- Zaman uyumlu uygulama oluşturma
- Zaman uyumlu çözümü test etme
- GetURLContents öğesini zaman uyumsuz bir metoda Dönüştür
- Sumpageslikleri zaman uyumsuz bir metoda Dönüştür
- StartButton_Click zaman uyumsuz bir metoda Dönüştür
- Zaman uyumsuz çözümü test etme
- geturlcontentsasync yöntemini bir .NET Framework yöntemiyle değiştirin
Tüm zaman uyumsuz örnek için örnek bölümüne bakın.
Önkoşullar
Visual Studio 2012 veya üzeri bir sürümü bilgisayarınızda yüklü olmalıdır. daha fazla bilgi için Visual Studio indirmeler sayfasına bakın.
WPF uygulaması oluşturma
Visual Studio’yu çalıştırın.
menü çubuğunda dosya, yeni, Project' yi seçin.
yeni Project iletişim kutusu açılır.
yüklü şablonlar bölmesinde Visual Basic öğesini seçin ve ardından proje türleri listesinden WPF uygulaması ' nı seçin.
Ad metin kutusuna girin
AsyncExampleWPFve sonra Tamam düğmesini seçin.Yeni proje Çözüm Gezgini görüntülenir.
Basit bir WPF MainWindow tasarımı
Visual Studio Code düzenleyicisinde MainWindow. xaml sekmesini seçin.
Araç kutusu penceresi görünür değilse, Görünüm menüsünü açın ve ardından araç kutusu' nu seçin.
MainWindow penceresine bir Button denetimi ve TextBox denetimi ekleyin.
TextBox denetimini vurgulayın ve Özellikler penceresinde aşağıdaki değerleri ayarlayın:
Name özelliğini olarak ayarlayın
resultsTextBox.Height özelliğini 250 olarak ayarlayın.
Width özelliğini 500 olarak ayarlayın.
Metin sekmesinde, Lucida Console veya Global tek boşluk gibi tek boşluklu bir yazı tipi belirtin.
Düğme denetimini vurgulayın ve Özellikler penceresinde aşağıdaki değerleri ayarlayın:
Name özelliğini olarak ayarlayın
startButton.İçerik özelliğinin değerini düğmeden başla olarak değiştirin.
Metin kutusunu ve düğmeyi her ikisinin de MainWindow penceresinde görünmesi için konumlandırın.
WPF XAML Tasarımcısı hakkında daha fazla bilgi için, bkz. XAML Tasarımcısı kullanarak Kullanıcı arabirimi oluşturma.
Başvuru ekleme
Çözüm Gezgini, projenizin adını vurgulayın.
menü çubuğunda Project, başvuru ekle' yi seçin.
Başvuru Yöneticisi iletişim kutusu görüntülenir.
iletişim kutusunun üst kısmında, projenizin .NET Framework 4,5 veya üstünü hedeflediğinden emin olun.
Derlemeler alanında, zaten seçili değilse Framework ' ü 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 Ekle
Çözüm Gezgini, MainWindow. xaml. vb için kısayol menüsünü açın ve kodu görüntüle' yi seçin.
ImportsZaten mevcut değilse, kod dosyasının en üstüne aşağıdaki deyimleri ekleyin.Imports System.Net.Http Imports System.Net Imports System.IO
Zaman uyumlu uygulama oluşturma
MainWindow. xaml tasarım penceresinde,
startButton_ClickMainWindow. xaml. vb ' de olay Işleyicisini oluşturmak için Başlat düğmesine çift tıklayın.MainWindow. xaml. vb dosyasında aşağıdaki kodu ' ın gövdesine kopyalayın
startButton_Click:resultsTextBox.Clear() SumPageSizes() resultsTextBox.Text &= vbCrLf & "Control returned to startButton_Click."Kod, uygulamayı yönlendiren yöntemini çağırır
SumPageSizesve denetim ' e döndüğünde bir ileti görüntülerstartButton_Click.Zaman uyumlu çözüm kodu aşağıdaki dört yöntemi içerir:
SumPageSizes, ' den Web sayfası URL 'Lerinin bir listesini alır veSetUpURLListardındanGetURLContentsDisplayResultsher URL 'yi çağırır ve işler.SetUpURLList, bir Web adresleri listesi oluşturur ve döndürür.GetURLContents, her bir Web sitesinin içeriğini indirir ve bir bayt dizisi olarak içeriğini döndürür.DisplayResults, her bir URL için bayt dizisindeki bayt sayısını görüntüler.
Aşağıdaki dört yöntemi kopyalayın ve ardından bunları
startButton_ClickMainWindow. xaml. vb içindeki olay işleyicisinin 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 sonra Başlat düğmesini seçin.
Aşağıdaki listeye benzer bir çıktı 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ı görüntülemenin birkaç saniye sürdiğine 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şıyamaz, ekranı kaplamaz, simge durumuna küçültebilir ya da kapatabilirsiniz. Bu çalışmalar, bayt sayıları görünene kadar başarısız olur. Bir Web sitesi yanıt vermiyorsa, hangi sitenin başarısız olduğunun belirtii olmaz. Beklemeyi durdurup programı kapatmanız zordur.
GetURLContents öğesini zaman uyumsuz bir metoda Dönüştür
Zaman uyumlu çözümü zaman uyumsuz bir çözüme dönüştürmek için,
GetURLContentsHttpWebRequest.GetResponse yönteme ve yöntemine yapılan çağrılar Stream.CopyTo uygulamanın Web 'e eriştiği yerdir. .NET Framework, her iki yöntemin de zaman uyumsuz sürümlerini sağlayarak dönüştürmeyi kolaylaştırır.İçinde kullanılan yöntemler hakkında daha fazla bilgi için
GetURLContentsbkz WebRequest ..Not
Bu izlenecek yolda bulunan adımları izleyerek bazı derleyici hataları görüntülenir. Bunları yoksayabilir ve İzlenecek yol ile devam edebilirsiniz.
' In üçüncü satırında çağrılan yöntemi,
GetURLContentsGetResponsezaman uyumsuz, görev tabanlı GetResponseAsync metoda değiştirin.Using response As WebResponse = webReq.GetResponseAsync()GetResponseAsyncdöndürür Task<TResult> . Bu durumda, görev dönüş değişkeni,TResulttüründedir WebResponse . Görev,WebResponseistenen veriler indirildikten ve görevin tamamlanmasını çalıştırdıktan sonra gerçek bir nesne oluşturmak için bir taahhüddir.WebResponseGörevden değeri almak için, aşağıdaki kodda gösterildiği gibi çağrısına bir await işleci uygulayınGetResponseAsync.Using response As WebResponse = Await webReq.GetResponseAsync()Awaitİşleç, beklenen görev tamamlanana kadar geçerli yöntemin yürütülmesini askıya alırGetURLContents. Bu arada, Denetim geçerli yöntemi çağırana döner. Bu örnekte, geçerli yöntemGetURLContentsve arayan ' dırSumPageSizes. Görev tamamlandığında, taahhüt edilenWebResponsenesne, beklenen görevin değeri olarak üretilir ve değişkenine atanırresponse.Önceki deyim, ne olacağını açıklamak için aşağıdaki iki ifadeye ayrılabilir.
Dim responseTask As Task(Of WebResponse) = webReq.GetResponseAsync() Using response As WebResponse = Await responseTaskÇağrısı
webReq.GetResponseAsyncbirTask(Of WebResponse)veya döndürürTask<WebResponse>. SonraAwaitdeğeri almak için göreve bir işleç uygulanırWebResponse.Zaman uyumsuz yönteminizin, görevin tamamlanmasına bağlı olmaması durumunda, zaman uyumsuz metoda yapılan çağrıdan sonra ve Await işleci uygulanmadan önce bu iki deyim arasında bu işe devam edebilir. örnekler için bkz. nasıl yapılır: async ve Await kullanarak birden çok Web isteğini paralel hale getirme (Visual Basic) ve nasıl yapılır: Task. whenall (Visual Basic) kullanarak zaman uyumsuz izlenecek yolu genişletme.
AwaitÖnceki adımda işleci eklediğiniz için bir derleyici hatası oluşur. İşleci yalnızca zaman uyumsuz değiştiriciyle işaretlenen yöntemlerde kullanılabilir. Çağrısını ' a ' çağrısı ile değiştirmek için dönüştürme adımlarını tekrarlarken hatayı yoksayınCopyToCopyToAsync.Olarak çağrılan metodun adını değiştirin CopyToAsync .
CopyToYa daCopyToAsyncyöntemi, bayt bağımsız değişkenine bayt kopyalar,contentve anlamlı bir değer döndürmez. Zaman uyumlu sürümde, çağrısıCopyTobir değer döndürmeyen basit bir ifadedir. Zaman uyumsuz sürüm,CopyToAsyncbir döndürür Task . Görev, "Task (void)" gibi çalışır ve yöntemin beklenmesine olanak sağlar.AwaitawaitCopyToAsyncAşağıdaki kodda gösterildiği gibi, çağrısına yönelik veya çağrısı yapın.Await responseStream.CopyToAsync(content)Önceki ifade aşağıdaki iki kod satırını abbreviates.
' 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
Tüm bunlar ' de yapılacak şekilde,
GetURLContentsyöntem imzasını ayarlamasıdır.Awaitİşlecini yalnızca zaman uyumsuz değiştiriciyle işaretlenen yöntemlerde kullanabilirsiniz. Aşağıdaki kodun gösterdiği gibi, yöntemi zaman uyumsuz bir yöntem olarak işaretlemek için değiştirici ekleyin.Private Async Function GetURLContents(url As String) As Byte()Zaman uyumsuz bir yöntemin dönüş türü yalnızca Task , olabilir Task<TResult> . Visual Basic, yöntemi
Functionbir veya döndüren birTaskTask(Of T), ya da yönteminin bir olması gerekirSub. Genellikle, birSubYöntem yalnızca zaman uyumsuz olay işleyicide kullanılır, buradaSubgereklidir. Diğer durumlarda,Task(T)Tamamlanan yöntemin T türünde bir değer döndüren bir Return ifadesine sahip olması veTaskTamamlanan yöntemin anlamlı bir değer döndürmemesi durumunda kullanmanız gerekir.Daha fazla bilgi için bkz. Async Return Types (Visual Basic).
Yöntem
GetURLContentsbir return ifadesine sahiptir ve ifade bir bayt dizisi döndürür. Bu nedenle, zaman uyumsuz sürümün dönüş türü görev (T), burada T bir bayt dizisidir. Yöntem imzasında aşağıdaki değişiklikleri yapın:Dönüş türünü olarak değiştirin
Task(Of Byte()).Kurala göre, zaman uyumsuz metotların "Async" ile biten adları vardır. bu nedenle, yöntemi yeniden adlandırın
GetURLContentsAsync.
Aşağıdaki kod bu değişiklikleri gösterir.
Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())Bu az değişiklikle,
GetURLContentszaman uyumsuz bir metoda dönüştürme işlemi tamamlanmıştır.
Sumpageslikleri zaman uyumsuz bir metoda Dönüştür
İçin önceki yordamdaki adımları tekrarlayın
SumPageSizes. İlk olarak, çağrısınıGetURLContentszaman uyumsuz bir çağrıya değiştirin.GetURLContentsGetURLContentsAsyncDaha önce yapmadıysanız, ' dan ' a çağrılan metodun adını değiştirin.AwaitGetURLContentsAsyncBayt dizi değerini almak için döndüren göreve uygulanır.
Aşağıdaki kod bu değişiklikleri gösterir.
Dim urlContents As Byte() = Await GetURLContentsAsync(url)Önceki atama, aşağıdaki iki kod satırını abbreviates.
' 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 getContentsTaskYöntemin imzasında aşağıdaki değişiklikleri yapın:
Yöntemi
Asyncdeğiştiriciyle işaretleyin.Yöntem adına "Async" ekleyin.
Bir görev dönüş değişkeni yok, T, bu kez
SumPageSizesAsynct için bir değer döndürmüyor. (yöntemin hiçbir yöntemi yokturReturn.) Ancak, yöntemi birTaskolarak bir olarak döndürmelidir. Bu nedenle, yöntem türünü olarak değiştirinSubFunction. İşlevin dönüş türüTask.
Aşağıdaki kod bu değişiklikleri gösterir.
Private Async Function SumPageSizesAsync() As Task' A dönüştürme
SumPageSizesSumPageSizesAsyncişlemi tamamlanmıştır.
StartButton_Click zaman uyumsuz bir metoda Dönüştür
Daha önce yapmadıysanız, olay işleyicisinde, çağrılan yöntemin adını
SumPageSizesolarak olarak değiştirinSumPageSizesAsync.SumPageSizesAsyncZaman uyumsuz bir yöntem olduğundan, olay işleyicisindeki kodu, sonucu bekleme olarak değiştirin.SumPageSizesAsyncİçindeki çağrısını yansıtan çağrıCopyToAsyncGetURLContentsAsync. ÇağrıTaska değil, döndürürTask(T).Önceki yordamlarda olduğu gibi, çağrıyı tek bir deyim veya iki deyim kullanarak dönüştürebilirsiniz. Aşağıdaki kod bu değişiklikleri gösterir.
' One-step async call. Await SumPageSizesAsync() ' Two-step async call. Dim sumTask As Task = SumPageSizesAsync() Await sumTaskİşlemi yanlışlıkla yeniden girmeye engel olmak için,
startButton_ClickBaşlangıç düğmesini devre dışı bırakmak için aşağıdaki ifadeyi ' ın üst kısmına ekleyin.' Disable the button until the operation is complete. startButton.IsEnabled = FalseOlay işleyicisinin sonundaki düğmeyi yeniden etkinleştirebilirsiniz.
' Reenable the button in case you want to run the operation again. startButton.IsEnabled = TrueYeniden giriş hakkında daha fazla bilgi için bkz. zaman uyumsuz uygulamalarda yeniden girişi işleme (Visual Basic).
Son olarak,
Asyncolay işleyicisinin beklebilmesi için değiştiricisini bildirime ekleyinSumPagSizesAsync.Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.ClickGenellikle, olay işleyicilerinin adları değiştirilmez.
TaskOlay işleyicilerinin Visual Basic yordamlar olması gerektiğinden, dönüş türü olarak değiştirilmezSub.Projenin zaman uyumlu olarak zaman uyumsuz işlemeye dönüştürülmesi işlemi tamamlanır.
Zaman uyumsuz çözümü test etme
Programı çalıştırmak için F5 tuşunu seçin ve sonra Başlat düğmesini seçin.
Zaman uyumlu çözümün çıktısına benzeyen çıkış görünmelidir. Ancak, aşağıdaki farklılıklara dikkat edin.
İşlem tamamlandıktan sonra sonuçların hepsi aynı anda gerçekleşmiyor. Örneğin, her iki program içinde
startButton_Clickmetin kutusunu temizleyen bir satır içerir. Tek bir sonuç kümesi görüntülendikten sonra Başlat düğmesini ikinci bir kez seçerseniz, çalıştırmalar arasındaki metin kutusunu temizlemek amaç. Zaman uyumlu sürümde, metin kutusu yalnızca sayımlar ikinci kez görüntülenmeden önce temizlenir, İndirmeler tamamlandığında ve Kullanıcı arabirimi iş parçacığı başka iş yapmak için ücretsizdir. Zaman uyumsuz sürümde, Başlat düğmesini seçtikten sonra metin kutusu hemen temizlenir.En önemlisi, indirme sırasında UI iş parçacığı engellenmiyor. Web kaynakları indirilirken, sayıldıkça 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ı alanda bulunan x) 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, HttpClient.GetByteArrayAsync(String) yöntemi Bu izlenecek yol için yalnızca ihtiyacınız olanları yapar.
GetURLContentsAsyncDaha önceki bir yordamda oluşturduğunuz yöntemi yerine kullanabilirsiniz.İlk adım HttpClient yönteminde bir nesne oluşturmaktır
SumPageSizesAsync. Yönteminin başlangıcında 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}İçinde, yöntemine yapılan çağrıyı yöntemine
SumPageSizesAsync,GetURLContentsAsyncbir çağrı ile değiştirinHttpClient.Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)Yazdığınız yöntemi kaldırın veya not edin
GetURLContentsAsync.Programı çalıştırmak için F5 tuşunu seçin ve sonra 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 açıklandığı, ancak sizin de daha az çaba gösteren davranışla eşleşmelidir.
Örnek
Aşağıda, zaman uyumsuz yöntemi kullanan dönüştürülmüş zaman uyumsuz çözümün tam örneği verilmiştir GetURLContentsAsync . Özgün, zaman uyumlu çözüme kesinlikle benzediğine dikkat 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, yöntemini kullanan çözümün tam örneğini içerir 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
Ayrıca bkz.
- Zaman uyumsuz örnek: Web 'e yönelik Izlenecek yol (C# ve Visual Basic)
- Await Işleci
- Eş
- 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 Izlenecek yolu genişletme (Visual Basic)
- Nasıl yapılır: Async ve await kullanarak birden çok Web Isteğini paralel hale getirme (Visual Basic)