İ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:

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

  1. Visual Studio’yu çalıştırın.

  2. Menü çubuğunda Dosya, Yeni, Proje'yi seçin.

    Yeni Proje iletişim kutusu açılır.

  3. Yüklü Şablonlar bölmesinde Visual Basic'i ve ardından proje türleri listesinden WPF Uygulaması'nı seçin.

  4. 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

  1. Visual Studio Code Düzenleyicisi'nde MainWindow.xaml sekmesini seçin.

  2. Araç Kutusu penceresi görünmüyorsa Görünüm menüsünü açın ve Araç Kutusu'nu seçin.

  3. MainWindow penceresine Düğme denetimi ve TextBox denetimi ekleyin.

  4. 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.

  5. 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.

  6. 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

  1. Çözüm Gezgini'de projenizin adını vurgulayın.

  2. Menü çubuğunda Proje, Başvuru Ekle'yi seçin.

    Başvuru Yöneticisi iletişim kutusu görüntülenir.

  3. İletişim kutusunun üst kısmında projenizin .NET Framework 4.5 veya üstünü hedeflediğini doğrulayın.

  4. Derlemeler alanında, henüz seçilmediyse Çerçeve'yi seçin.

  5. Ad listesinde System.Net.Http onay kutusunu seçin.

  6. İletişim kutusunu kapatmak için Tamam düğmesini seçin.

Gerekli Imports deyimlerini ekleme

  1. Çözüm Gezgini'da, MainWindow.xaml.vb kısayol menüsünü açın ve kodu görüntüle'yi seçin.

  2. 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

  1. MainWindow.xaml tasarım penceresinde Başlat düğmesine çift tıklayarak MainWindow.xaml.vb olay işleyicisini startButton_Click oluşturun.

  2. 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üğünde startButton_Clickbir ileti görüntüler.

  3. Zaman uyumlu çözümün kodu aşağıdaki dört yöntemi içerir:

    • SumPageSizes, web sayfası URL'lerinin SetUpURLList listesini alır ve ardından her URL'yi işleyip çağırır GetURLContentsDisplayResults .

    • 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

  1. 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

  1. 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ırGetURLContents. .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()
    
  2. GetResponseAsync bir Task<TResult>döndürür. Bu durumda, görev dönüş değişkeni türüne TResultsahiptir WebResponse. Görev, istenen veriler indirildikten ve tamamlanmaya kadar çalıştırıldıktan sonra gerçek WebResponse bir nesne üretmeye yönelik bir sözdür.

    Görevden değeri almak için çağrısına WebResponseGetResponseAsyncaşağıdaki kodda gösterildiği gibi bir Await iş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 şeklindedir SumPageSizes. Görev tamamlandığında, taahhüt edilen WebResponse nesne, beklenen görevin değeri olarak oluşturulur ve değişkenine responseatanı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 veya Task(Of WebResponse)Task<WebResponse>döndürür. Ardından, değeri almak WebResponse için göreve bir Await 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).

  3. ö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ı CopyToCopyToAsyncyoksayın.

    • olarak adlandırılan CopyToAsyncyöntemin adını değiştirin.

    • CopyTo veya CopyToAsync yö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ü bir CopyToAsyncTaskdö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 veya await çağrısına CopyToAsyncuygulayı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
      
  4. yapılacak tek şey GetURLContents yöntem imzasını ayarlamaktır. işlecini Await 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()
    
  5. Zaman uyumsuz yöntemin dönüş türü yalnızca , Task<TResult>olabilirTask. Visual Basic'te, yöntemi veya Function döndüren Task bir Task(Of T)veya yöntemi olmalıdır Sub. Genellikle bir Sub yöntem yalnızca gerekli olan Sub 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ız Task .

    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 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 GetURLContents işlemi tamamlanır.

SumPageSizes'i zaman uyumsuz bir yönteme dönüştürme

  1. 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 GetURLContentsGetURLContentsAsyncyö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
    
  2. 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 yoktur Return .) Ancak, yöntemi beklenebilir olması için döndürmelidir Task . Bu nedenle, yöntem türünü olarak SubFunctiondeğiştirin. İşlevin dönüş türü şeklindedir Task.

    Aşağıdaki kodda bu değişiklikler gösterilmektedir.

    Private Async Function SumPageSizesAsync() As Task
    

    dönüştürme SumPageSizesSumPageSizesAsync işlemi tamamlandı.

startButton_Click zaman uyumsuz bir yönteme dönüştürme

  1. Olay işleyicisinde, henüz yapmadıysanız olarak adlandırılan yöntemin SumPageSizesSumPageSizesAsyncadını olarak değiştirin.

  2. 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ına CopyToAsyncGetURLContentsAsyncyansıtıyor. Çağrısı bir döndürür Task, değil Task(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
    
  3. İş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).

  4. Son olarak, olay işleyicisinin Async bekleyebilmesi SumPagSizesAsynciç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

  1. Programı çalıştırmak için F5 tuşunu seçin ve ardından Başlat düğmesini seçin.

  2. 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

  1. .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}
    
  2. içinde SumPageSizesAsync, yönteminize GetURLContentsAsync yapılan çağrıyı yöntemine HttpClient yapılan bir çağrıyla değiştirin.

    Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
    
  3. Yazdığınız yöntemi kaldırın veya açıklama satırı oluşturun GetURLContentsAsync .

  4. 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, GetByteArrayAsyncyö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.