Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 başlatı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
AsyncExampleWPFve 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
resultsTextBoxayarlayı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
startButtonayarlayı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ı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'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
Importsdeyimleri 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_Clickoluşturun.MainWindow.xaml.vb aşağıdaki kodu gövdesine
startButton_Clickkopyalayın:resultsTextBox.Clear() SumPageSizes() resultsTextBox.Text &= vbCrLf & "Control returned to startButton_Click."Kod,
SumPageSizesuygulamasını çalıştıran yöntemini çağırır ve denetim öğesine döndüğündestartButton_Clickbir ileti görüntüler.Zaman uyumlu çözümün kodu aşağıdaki dört yöntemi içerir:
SumPageSizes, web sayfası URL'lerininSetUpURLListlistesini alır ve ardından her URL'yi işleyip çağırırGetURLContentsDisplayResults.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_Clickaltı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
GetURLContentsyapılan çağrıların uygulamanın web'e HttpWebRequest.GetResponse eriştiği yer olmasıdırStream.CopyTo. .NET Framework, her iki yöntemin zaman uyumsuz sürümlerini sağlayarak dönüştürmeyi kolaylaştırır.içinde
GetURLContentskullanı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
GetURLContentsGetResponseçağrılan yöntemini, zaman uyumsuz, görev tabanlı GetResponseAsync yönteme değiştirin.Using response As WebResponse = webReq.GetResponseAsync()GetResponseAsyncbir Task<TResult>döndürür. Bu durumda, görev dönüş değişkeni türüneTResultsahiptir WebResponse. Görev, istenen veriler indirildikten ve tamamlanmaya kadar çalıştırıldıktan sonra gerçekWebResponsebir nesne üretmeye yönelik bir sözdür.Görevden değeri almak için çağrısına
WebResponseaşağıdaki kodda gösterildiği gibi birGetResponseAsyncişleci uygulayın.Using response As WebResponse = Await webReq.GetResponseAsync()işleci
Await,GetURLContentsbeklenen 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 edilenWebResponsenesne, beklenen görevin değeri olarak oluşturulur ve değişkenineresponseatanı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.GetResponseAsyncveyaTask(Of WebResponse)Task<WebResponse>döndürür. Ardından, değeri almakAwaitiçin göreve birWebResponseiş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
Awaitiç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ıCopyToCopyToAsyncyoksayın.olarak adlandırılan CopyToAsyncyöntemin adını değiştirin.
CopyToveyaCopyToAsyncyöntemi baytlarıcontentbağı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ü birCopyToAsyncTaskdö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ınaawaituygulayınCopyToAsync.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
GetURLContentsyöntem imzasını ayarlamaktır. işleciniAwaityalnı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 , TaskolabilirTask<TResult>. Visual Basic'te, yöntemi veya
FunctiondöndürenTaskbirTask(Of T)veya yöntemi olmalıdırSub. Genellikle birSubyöntem yalnızca gerekli olanSubzaman 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
GetURLContentsreturn 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
GetURLContentsAsyncyeniden 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
GetURLContentsiş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ıGetURLContentszaman uyumsuz bir çağrı olarak değiştirin.henüz yapmadıysanız , olarak adlandırılan
GetURLContentsGetURLContentsAsyncyöntemin adını olarak değiştirin.Bayt dizisi değerini almak için döndüren
Awaitgöreve uygulayınGetURLContentsAsync.
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 getContentsTaskYöntemin imzasında aşağıdaki değişiklikleri yapın:
yöntemini değiştirici ile
Asyncişaretleyin.Yöntem adına "Async" ekleyin.
T için bir değer döndürmediğinden bu kez
SumPageSizesAsyncT 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ü olarakSubFunctiondeğiştirin. İşlevin dönüş türü şeklindedirTask.
Aşağıdaki kodda bu değişiklikler gösterilmektedir.
Private Async Function SumPageSizesAsync() As Taskdönüştürme
SumPageSizesSumPageSizesAsynciş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
SumPageSizesSumPageSizesAsyncadını olarak değiştirin.Zaman
SumPageSizesAsyncuyumsuz bir yöntem olduğundan, sonucu beklemek için olay işleyicisindeki kodu değiştirin.çağrısı,
SumPageSizesAsynciçindeki çağrısınaCopyToAsyncGetURLContentsAsyncyansı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
startButton_Clickiçin üst kısmına aşağıdaki deyimi ekleyin.' Disable the button until the operation is complete. startButton.IsEnabled = FalseOlay işleyicisinin sonundaki düğmeyi yeniden oluşturabilirsiniz.
' 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ş İşleme (Visual Basic).
Son olarak, olay işleyicisinin
AsyncbekleyebilmesiSumPagSizesAsynciçin değiştiriciyi bildirimine ekleyin.Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.ClickGenellikle, olay işleyicilerinin adları değiştirilmez. Olay işleyicilerinin Visual Basic'te yordamlar olması
Taskgerektiğinden dönüş türü olarak değiştirilmezSub.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_Clickiç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
GetURLContentsAsyncoluş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önteminizeGetURLContentsAsyncyapılan çağrıyı yöntemineHttpClientyapı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, HttpClientyöntemini kullanan çözümün tam örneğini GetByteArrayAsync 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
- Asenkron
- 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)