Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 feladatokat gyakran már létrehozásukkor várják, ahogy a következő példa is mutatja.
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.
Megjegyzés:
A projekt elvégzéséhez telepítve kell lennie a Visual Studio 2012 vagy újabb verziójának, valamint a .NET-keretrendszer 4.5-ös vagy újabb verziójának.
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
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övegdoboztresultsTextBox.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
Importsa következőhözSystem.Net.Http: .
A kód hozzáadása
A dizájnablakban, a MainWindow.xaml fájlban kattintson duplán a gombra az
startButton_Clickeseménykezelő létrehozásához a MainWindow.xaml.vb fájlban.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.Adja hozzá a következő támogatási módszereket a projekthez:
ProcessURLAsyncegy HttpClient módszert használ a webhely tartalmának bájttömbként történő letöltésére. A támogatási módszer ezutánProcessURLAsyncmegjeleníti és visszaadja a tömb hosszát.DisplayResultsa 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 a
startButton_Clickeseménykezelő után a MainWindow.xaml.vb fájlban.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 SubVégül adja meg a metódust
CreateMultipleTasksAsync, amely a következő lépéseket hajtja végre.A metódus deklarál egy
HttpClientobjektumot, amelyhez a GetByteArrayAsync metódusProcessURLAsync-ben hozzá kell férnie.A metódus három típusú Task<TResult>feladatot hoz létre és indít el, ahol
TResultegy egész szám található. Amikor minden tevékenység befejeződik,DisplayResultsmegjelení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
Awaitoperátor felfüggeszti a végrehajtástCreateMultipleTasksAsync, amíg a várt tevékenység be nem fejeződik. Az operátor az egyes befejezett feladatok hívásából is lekéri a visszatérési értéket aProcessURLAsynchívásából.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 FunctionA program futtatásához válassza az F5 billentyűt, majd a Start gombot.
Többször futtassa a programot annak ellenőrzésére, hogy a három feladat nem mindig ugyanabban a sorrendben fejeződik be, és hogy a befejezési sorrend nem feltétlenül egyezik meg azzal a sorrenddel, amelyben létrehozták és várakoztak rájuk.
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