Aracılığıyla paylaş


Nasıl yapılır: Async ve Await Kullanarak Birden Çok Web İsteğini Paralel Yapma (Visual Basic)

Zaman uyumsuz bir yöntemde, görevler oluşturulduklarında başlatılır. Await işleci, yöntem içinde görevin tamamlanmadan işlemenin devam edemeyeceği noktada, göreve uygulanır. Çoğunlukla bir görev oluşturulduğu anda beklenir, aşağıdaki örnekte gösterildiği gibi.

Dim result = Await someWebAccessMethodAsync(url)

Ancak, programınızın görevin tamamlanmasına bağlı olmayan başka işleri varsa, görevi oluşturma işlemini görevi beklemeden ayırabilirsiniz.

' The following line creates and starts the task.
Dim myTask = someWebAccessMethodAsync(url)

' While the task is running, you can do other work that does not depend
' on the results of the task.
' . . . . .

' The application of Await suspends the rest of this method until the task is
' complete.
Dim result = Await myTask

Bir görevi başlatma ve bekleme arasında, diğer görevleri başlatabilirsiniz. Ek görevler örtük bir şekilde paralel çalıştırılır, ancak ilave iş parçacıkları oluşturulmaz.

Aşağıdaki program üç asenkron web indirmesi başlatır ve ardından çağrılma sırasına göre onları bekler. Programı çalıştırdığınızda, görevlerin her zaman oluşturuldukları ve beklendikleri sırayla tamamlanmadıklarına dikkat edin. Oluşturulduklarında çalışmaya başlarlar ve yöntem await ifadelerine ulaşmadan önce bir veya daha fazla görev tamamlanabilir.

Uyarı

Bu projeyi tamamlamak için bilgisayarınızda Visual Studio 2012 veya üzeri ve .NET Framework 4.5 veya üzeri yüklü olmalıdır.

Aynı anda birden çok görevi başlatan başka bir örnek için, Task.WhenAll (Visual Basic) Kullanarak Zaman Uyumsuz İlerleme Senaryosunu Uzatma konusuna bakın.

Bu örneğin kodunu Geliştirici Kodu Örnekleri'nden indirebilirsiniz.

Projeyi kurmak için

  1. WPF uygulaması ayarlamak için aşağıdaki adımları tamamlayın. Bu adımlar için ayrıntılı yönergeleri İzlenecek Yol: Async ve Await Kullanarak Web'e Erişme (Visual Basic) bölümünde bulabilirsiniz.

    • Metin kutusu ve düğme içeren bir WPF uygulaması oluşturun. düğmesini startButtonve metin kutusunu olarak adlandırın resultsTextBox.

    • System.Net.Http için bir referans ekleyin.

    • MainWindow.xaml.vb dosyasında Imports için bir System.Net.Http deyimi ekleyin.

Kodu eklemek için

  1. MainWindow.xaml tasarım penceresinde, MainWindow.xaml.vb olay işleyicisini startButton_Click oluşturmak için düğmeye çift tıklayın.

  2. Aşağıdaki kodu kopyalayın ve MainWindow.xaml.vb gövdesine startButton_Click yapıştırın.

    resultsTextBox.Clear()
    Await CreateMultipleTasksAsync()
    resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
    

    Kod, CreateMultipleTasksAsyncuygulamayı yönlendiren zaman uyumsuz bir yöntemi çağırır.

  3. Projeye aşağıdaki destek yöntemlerini ekleyin:

    • ProcessURLAsync bir HttpClient web sitesinin içeriğini bayt dizisi olarak indirmek için bir yöntem kullanır. Ardından destek yöntemi, ProcessURLAsync dizinin uzunluğunu görüntüler ve döndürür.

    • DisplayResults her URL için bayt dizisindeki bayt sayısını görüntüler. Bu görüntü, her görevin indirilmesinin ne zaman tamamlandığını gösterir.

    Aşağıdaki yöntemleri kopyalayın ve MainWindow.xaml.vb olay işleyicisinin startButton_Click arkasına yapıştırın.

    Private Async Function ProcessURLAsync(url As String, client As HttpClient) As Task(Of Integer)
    
        Dim byteArray = Await client.GetByteArrayAsync(url)
        DisplayResults(url, byteArray)
        Return byteArray.Length
    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
    
  4. Son olarak, aşağıdaki adımları gerçekleştiren yöntemini CreateMultipleTasksAsynctanımlayın.

    • Yöntem, HttpClient içinde GetByteArrayAsync yöntemine erişmeniz gereken bir ProcessURLAsync nesnesi tanımlar.

    • Yöntem, Task<TResult> türünde üç görev oluşturur ve başlatır; burada TResult bir tamsayıdır. Her görev tamamlandıktan sonra görevin DisplayResults URL'sini ve indirilen içeriğin uzunluğunu görüntüler. Görevler zaman uyumsuz olarak çalıştığından, sonuçların görüntülenme sırası bildirildiği sıraylan farklı olabilir.

    • Bu yöntem, her görevin tamamlanmasını bekler. Her Await işleci, beklenen görev tamamlanana kadar yürütmeyi CreateMultipleTasksAsync askıya alır. Operatör, tamamlanan her görevdeki ProcessURLAsync çağrısından dönüş değerini de alır.

    • Görevler tamamlandığında ve tamsayı değerleri alındığında, yöntem web sitelerinin uzunluklarını toplar ve sonucu görüntüler.

    Aşağıdaki yöntemi kopyalayın ve çözümünüzde yapıştırın.

    Private Async Function CreateMultipleTasksAsync() 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}
    
        ' Create and start the tasks. As each task finishes, DisplayResults
        ' displays its length.
        Dim download1 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com", client)
        Dim download2 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com/library/hh156528(VS.110).aspx", client)
        Dim download3 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com/library/67w7t67f.aspx", client)
    
        ' Await each task.
        Dim length1 As Integer = Await download1
        Dim length2 As Integer = Await download2
        Dim length3 As Integer = Await download3
    
        Dim total As Integer = length1 + length2 + length3
    
        ' Display the total count for all of the websites.
        resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
                                             "Total bytes returned:  {0}" & vbCrLf, total)
    End Function
    
  5. Programı çalıştırmak için F5 tuşunu seçin ve ardından Başlat düğmesini seçin.

    Programı birkaç kez çalıştırarak üç görevi her zaman aynı sırada bitirmediğini ve bitirdikleri sıranın oluşturuldukları ve beklendikleri sıra olmadığını doğrulayın.

Örnek

Aşağıdaki kod, tam örneği içerir.

' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http

Class MainWindow

    Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
        resultsTextBox.Clear()
        Await CreateMultipleTasksAsync()
        resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
    End Sub

    Private Async Function CreateMultipleTasksAsync() 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}

        ' Create and start the tasks. As each task finishes, DisplayResults
        ' displays its length.
        Dim download1 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com", client)
        Dim download2 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com/library/hh156528(VS.110).aspx", client)
        Dim download3 As Task(Of Integer) =
            ProcessURLAsync("https://msdn.microsoft.com/library/67w7t67f.aspx", client)

        ' Await each task.
        Dim length1 As Integer = Await download1
        Dim length2 As Integer = Await download2
        Dim length3 As Integer = Await download3

        Dim total As Integer = length1 + length2 + length3

        ' Display the total count for all of the websites.
        resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
                                             "Total bytes returned:  {0}" & vbCrLf, total)
    End Function

    Private Async Function ProcessURLAsync(url As String, client As HttpClient) As Task(Of Integer)

        Dim byteArray = Await client.GetByteArrayAsync(url)
        DisplayResults(url, byteArray)
        Return byteArray.Length
    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 bakınız