Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In einer asynchronen Methode werden Aufgaben gestartet, wenn sie erstellt werden. Der Await-Operator wird auf den Vorgang an der Stelle in der Methode angewendet, an der die Verarbeitung erst fortgesetzt werden kann, wenn der Vorgang abgeschlossen ist. Häufig wird eine Aufgabe erwartet, sobald sie erstellt wird, wie im folgenden Beispiel gezeigt.
Dim result = Await someWebAccessMethodAsync(url)
Sie können das Erstellen der Aufgabe jedoch vom Warten auf deren Abschluss trennen, wenn Ihr Programm andere Arbeiten zu erledigen hat, die nicht von der Fertigstellung der Aufgabe abhängen.
' 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
Zwischen dem Starten eines Vorgangs und dem Warten darauf können Sie andere Vorgänge starten. Die zusätzlichen Aufgaben werden implizit parallel ausgeführt, es werden jedoch keine zusätzlichen Threads erstellt.
Das folgende Programm startet drei asynchrone Webdownloads und erwartet sie dann in der Reihenfolge, in der sie aufgerufen werden. Beachten Sie, dass die Aufgaben beim Ausführen des Programms nicht immer in der Reihenfolge enden, in der sie erstellt und erwartet werden. Sie beginnen mit der Ausführung, wenn sie erstellt werden, und eine oder mehrere Aufgaben werden u. U. abgeschlossen, bevor die Methode die await-Ausdrucke erreicht.
Hinweis
Um dieses Projekt abzuschließen, müssen Sie Visual Studio 2012 oder höher und .NET Framework 4.5 oder höher auf Ihrem Computer installiert haben.
Ein weiteres Beispiel zum gleichzeitigen Starten mehrerer Aufgaben finden Sie unter How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic).
Sie können den Code für dieses Beispiel aus Den Entwicklercodebeispielen herunterladen.
So richten Sie das Projekt ein
Führen Sie die folgenden Schritte aus, um eine WPF-Anwendung einzurichten. Ausführliche Anweisungen zu diesen Schritten finden Sie in der exemplarischen Vorgehensweise: Zugreifen auf das Web mithilfe von Async und Await (Visual Basic).
Erstellen Sie eine WPF-Anwendung, die ein Textfeld und eine Schaltfläche enthält. Benennen Sie die Schaltfläche
startButton, und benennen Sie das TextfeldresultsTextBox.Fügen Sie einen Verweis für System.Net.Http.
Fügen Sie in der Datei MainWindow.xaml.vb eine
Imports-Anweisung fürSystem.Net.Httphinzu.
So fügen Sie den Code hinzu
Doppelklicken Sie im Entwurfsfenster MainWindow.xaml auf die Schaltfläche, um den
startButton_ClickEreignishandler in MainWindow.xaml.vb zu erstellen.Kopieren Sie den folgenden Code, und fügen Sie ihn in MainWindow.xaml.vb in den Textkörper
startButton_Clickein.resultsTextBox.Clear() Await CreateMultipleTasksAsync() resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."Der Code ruft eine asynchrone Methode auf,
CreateMultipleTasksAsyncdie die Anwendung steuert.Fügen Sie dem Projekt die folgenden Supportmethoden hinzu:
ProcessURLAsyncverwendet eine HttpClient Methode zum Herunterladen der Inhalte einer Website als Bytearray. Die Supportmethode zeigtProcessURLAsyncdann die Länge des Arrays an und gibt sie zurück.DisplayResultszeigt die Anzahl der Bytes im Bytearray für jede URL an. Diese Anzeige zeigt an, wann jeder Vorgang den Download abgeschlossen hat.
Kopieren Sie die folgenden Methoden, und fügen Sie sie nach dem
startButton_ClickEreignishandler in MainWindow.xaml.vb ein.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 SubDefinieren Sie schließlich die Methode
CreateMultipleTasksAsync, die die folgenden Schritte ausführt.Die Methode deklariert ein
HttpClientObjekt, in GetByteArrayAsyncdem Sie auf die MethodeProcessURLAsynczugreifen müssen.Die Methode erstellt und startet drei Aufgaben vom Typ Task<TResult>, wobei
TResultes sich um eine ganze Zahl handelt. Beim Abschließen jeder Aufgabe zeigtDisplayResultsdie URL der Aufgabe sowie die Länge der heruntergeladenen Inhalte an. Da die Aufgaben asynchron ausgeführt werden, kann sich die Reihenfolge, in der die Ergebnisse angezeigt werden, von der Reihenfolge unterscheiden, in der sie deklariert wurden.Die Methode wartet auf den Abschluss jeder Aufgabe. Jeder
AwaitOperator hält die Ausführung vonCreateMultipleTasksAsyncan, bis die abzuwartende Aufgabe abgeschlossen ist. Der Operator ruft auch den Rückgabewert aus dem Aufruf vonProcessURLAsyncbei jeder abgeschlossenen Aufgabe ab.Wenn die Aufgaben abgeschlossen wurden und die ganzzahligen Werte abgerufen wurden, summiert die Methode die Längen der Websites und zeigt das Ergebnis an.
Kopieren Sie die folgende Methode, und fügen Sie sie in Ihre Lösung ein.
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 FunctionDrücken Sie die Taste F5, um das Programm auszuführen, und klicken Sie dann auf die Schaltfläche Starten .
Führen Sie das Programm mehrmals aus, um zu überprüfen, ob die drei Vorgänge nicht immer in derselben Reihenfolge enden und dass die Reihenfolge, in der sie fertig sind, nicht unbedingt die Reihenfolge ist, in der sie erstellt und erwartet werden.
Beispiel
Der folgende Code enthält das vollständige Beispiel.
' 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
Siehe auch
- Exemplarische Vorgehensweise: Zugreifen auf das Web mithilfe von Async und Await (Visual Basic)
- Asynchrone Programmierung mit „Async“ und „Await“ (Visual Basic)
- How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic) (Gewusst wie: Erweitern der asynchronen exemplarischen Vorgehensweise mit Task.WhenAll (Visual Basic))