Megosztás a következőn keresztül:


Útmutató: Több webkérelem párhuzamos létrehozása az Async és a Await használatával (Visual Basic)

Az aszinkron metódusban a tevékenységek a létrehozásukkor indulnak el. A Await operátor a metódus azon pontján van alkalmazva a tevékenységre, ahol a feldolgozás nem folytatódhat, amíg a tevékenység be nem fejeződik. A következő példában látható, hogy a feladatokat gyakran a létrehozásuk után várják.

Dim result = Await someWebAccessMethodAsync(url)

A tevékenység létrehozását azonban elkülönítheti a tevékenység várakozásától, ha a program más feladatokat is végrehajt, amelyek nem függnek a tevékenység befejezésétől.

' 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

A tevékenységek indítása és a várakozás között más tevékenységeket is elindíthat. A további feladatok implicit módon párhuzamosan futnak, de további szálak nem jönnek létre.

A következő program három aszinkron webes letöltést indít el, majd a hívás sorrendjében várja őket. Figyelje meg, hogy a program futtatásakor a tevékenységek nem mindig a létrehozásuk és várakozásuk sorrendjében fejeződnek be. A létrehozásukkor elkezdenek futni, és egy vagy több feladat befejeződhet, mielőtt a metódus elérné a várt kifejezéseket.

Feljegyzés

A projekt befejezéséhez a Visual Studio 2012 vagy újabb verziójával, valamint a .NET-keretrendszer 4.5-ös vagy újabb verziójával kell rendelkeznie a számítógépen.

Egy másik példa, amely egyszerre több tevékenységet indít el, tekintse meg az Async útmutató kiterjesztése a Task.WhenAll (Visual Basic) használatával című témakört.

A példához tartozó kódot a fejlesztői kódmintákból töltheti le.

A projekt beállítása

  1. WPF-alkalmazás beállításához hajtsa végre az alábbi lépéseket. Az alábbi lépések részletes útmutatását az útmutatóban találja: A web elérése az Async és a Await (Visual Basic) használatával.

    • Szövegdobozt és gombot tartalmazó WPF-alkalmazás létrehozása. Nevezze el a gombot startButton, és nevezze el a szövegdobozt resultsTextBox.

    • Adjon hozzá egy hivatkozást a következőhöz System.Net.Http: .

    • A MainWindow.xaml.vb fájlban adjon hozzá egy utasítást Imports a következőhöz System.Net.Http: .

A kód hozzáadása

  1. A MainWindow.xaml tervezőablakban kattintson duplán a gombra az eseménykezelő létrehozásához a startButton_Click MainWindow.xaml.vb.

  2. Másolja ki a következő kódot, és illessze be a MainWindow.xaml.vb törzsébe startButton_Click .

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

    A kód egy aszinkron metódust hív meg, CreateMultipleTasksAsyncamely az alkalmazást vezérli.

  3. Adja hozzá a következő támogatási módszereket a projekthez:

    • ProcessURLAsyncHttpClient a webhely tartalmát bájttömbként tölti le. A támogatási módszer ezután ProcessURLAsync megjeleníti és visszaadja a tömb hosszát.

    • DisplayResults a bájtok számát jeleníti meg az egyes URL-címek bájttömbjében. Ez a megjelenítés azt mutatja, hogy az egyes tevékenységek mikor fejezték be a letöltést.

    Másolja ki a következő metódusokat, és illessze be őket az eseménykezelő után a startButton_Click MainWindow.xaml.vb.

    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. Végül adja meg a metódust CreateMultipleTasksAsync, amely a következő lépéseket hajtja végre.

    • A metódus deklarál egy HttpClient objektumot, amelyhez hozzá kell férnie a metódushozGetByteArrayAsync.ProcessURLAsync

    • A metódus három típusú Task<TResult>feladatot hoz létre és indít el, ahol TResult egy egész szám található. Amikor minden tevékenység befejeződik, DisplayResults megjeleníti a tevékenység URL-címét és a letöltött tartalom hosszát. Mivel a tevékenységek aszinkron módon futnak, az eredmények megjelenési sorrendje eltérhet a deklarált sorrendtől.

    • A metódus az egyes tevékenységek befejezésére vár. Minden Await operátor felfüggeszti a végrehajtást CreateMultipleTasksAsync , amíg a várt tevékenység be nem fejeződik. Az operátor az egyes befejezett tevékenységek hívásából is lekéri a ProcessURLAsync visszatérési értéket.

    • A tevékenységek befejezése és az egész számértékek lekérése után a metódus összegzi a webhelyek hosszát, és megjeleníti az eredményt.

    Másolja ki a következő metódust, és illessze be a megoldásba.

    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. A program futtatásához válassza az F5 billentyűt, majd a Start gombot.

    Futtassa többször a programot annak ellenőrzéséhez, hogy a három tevékenység nem mindig ugyanabban a sorrendben fejeződik-e be, és hogy a befejezési sorrend nem feltétlenül az a sorrend, amelyben létrehozták és várták őket.

Példa

Az alábbi kód a teljes példát tartalmazza.

' 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

Lásd még