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.
Sie können eine Schaltfläche einrichten, mit der Sie eine asynchrone Anwendung abbrechen können, wenn Sie nicht warten möchten, bis sie abgeschlossen ist. Indem Sie den Beispielen in diesem Thema folgen, können Sie einer Anwendung, die den Inhalt einer Website oder einer Liste von Websites herunterlädt, eine Abbruchschaltfläche hinzufügen.
In den Beispielen wird die Benutzeroberfläche verwendet, die von Fine-Tuning Ihrer asynchronen Anwendung (Visual Basic) beschrieben wird.
Hinweis
Zum Ausführen der Beispiele müssen Sie Visual Studio 2012 oder höher und .NET Framework 4.5 oder höher auf Ihrem Computer installiert haben.
Abbrechen einer Aufgabe
Im ersten Beispiel wird die Schaltfläche "Abbrechen " einer einzelnen Downloadaufgabe zugeordnet. Wenn Sie die Schaltfläche auswählen, während die Anwendung Inhalte herunterdownloadet, wird der Download abgebrochen.
Herunterladen des Beispiels
Sie können das vollständige Windows Presentation Foundation (WPF)-Projekt aus dem Async-Beispiel herunterladen: Optimieren Sie Ihre Anwendung , und führen Sie dann die folgenden Schritte aus.
Dekomprimieren Sie die heruntergeladene Datei, und starten Sie Dann Visual Studio.
Wählen Sie auf der Menüleiste "Datei", "Öffnen", "Projekt/Projektmappe" aus.
Öffnen Sie im Dialogfeld "Projekt öffnen" den Ordner mit dem Beispielcode, den Sie dekomprimiert haben, und öffnen Sie dann die Lösungsdatei (.sln) für AsyncFineTuningVB.
Öffnen Sie im Projektmappen-Explorer das Kontextmenü für das CancelATask-Projekt, und wählen Sie dann Als Startprojekt festlegen aus.
Wählen Sie die F5-TASTE aus, um das Projekt auszuführen.
Wählen Sie die STRG+F5-Tasten aus, um das Projekt auszuführen, ohne es zu debuggen.
Wenn Sie das Projekt nicht herunterladen möchten, können Sie die MainWindow.xaml.vb Dateien am Ende dieses Themas überprüfen.
Erstellen des Beispiels
Die folgenden Änderungen fügen einer Anwendung, die eine Website herunterlädt, eine Schaltfläche "Abbrechen " hinzu. Wenn Sie das Beispiel nicht herunterladen oder erstellen möchten, können Sie das Endprodukt im Abschnitt "Vollständige Beispiele" am Ende dieses Themas überprüfen. Sternchen markieren die Änderungen im Code.
Um das Beispiel selbst zu erstellen, befolgen Sie schritt für Schritt die Anweisungen im Abschnitt "Herunterladen des Beispiels", wählen Sie aber StarterCode als Startprojekt anstelle von CancelATask aus.
Fügen Sie dann die folgenden Änderungen zur MainWindow.xaml.vb Datei dieses Projekts hinzu.
Deklarieren Sie eine
CancellationTokenSourceVariable,ctsdie sich im Bereich für alle Methoden befindet, die darauf zugreifen.Class MainWindow ' ***Declare a System.Threading.CancellationTokenSource. Dim cts As CancellationTokenSourceFügen Sie den folgenden Ereignishandler für die Schaltfläche "Abbrechen " hinzu. Der Ereignishandler verwendet die CancellationTokenSource.Cancel Methode, um
ctszu benachrichtigen, wenn der Benutzer den Abbruch anfordert.' ***Add an event handler for the Cancel button. Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs) If cts IsNot Nothing Then cts.Cancel() End If End SubNehmen Sie die folgenden Änderungen im Ereignishandler für die Schaltfläche "Start" vor.
startButton_ClickInstanziieren Sie die
CancellationTokenSource,cts.' ***Instantiate the CancellationTokenSource. cts = New CancellationTokenSource()Rufen Sie beim Aufruf von
AccessTheWebAsync, der den Inhalt einer angegebenen Website herunterlädt, die Eigenschaft CancellationTokenSource.Token vonctsals Argument auf. DieTokenEigenschaft gibt die Nachricht weiter, wenn der Abbruch angefordert wird. Fügen Sie einen Catch-Block hinzu, der eine Meldung anzeigt, wenn der Benutzer den Downloadvorgang abbricht. Der folgende Code zeigt die Änderungen.Try ' ***Send a token to carry the message if cancellation is requested. Dim contentLength As Integer = Await AccessTheWebAsync(cts.Token) resultsTextBox.Text &= vbCrLf & $"Length of the downloaded string: {contentLength}." & vbCrLf ' *** If cancellation is requested, an OperationCanceledException results. Catch ex As OperationCanceledException resultsTextBox.Text &= vbCrLf & "Download canceled." & vbCrLf Catch ex As Exception resultsTextBox.Text &= vbCrLf & "Download failed." & vbCrLf End Try
Verwenden Sie in
AccessTheWebAsyncdie HttpClient.GetAsync(String, CancellationToken)-Überladung derGetAsync-Methode im HttpClient-Typ, um die Inhalte einer Website herunterzuladen. Übergeben Siect, der CancellationToken-Parameter vonAccessTheWebAsync, als zweites Argument. Das Token trägt die Nachricht, wenn der Benutzer die Schaltfläche "Abbrechen " auswäht.Der folgende Code zeigt die Änderungen in
AccessTheWebAsync.' ***Provide a parameter for the CancellationToken. Async Function AccessTheWebAsync(ct As CancellationToken) As Task(Of Integer) Dim client As HttpClient = New HttpClient() resultsTextBox.Text &= vbCrLf & "Ready to download." & vbCrLf ' You might need to slow things down to have a chance to cancel. Await Task.Delay(250) ' GetAsync returns a Task(Of HttpResponseMessage). ' ***The ct argument carries the message if the Cancel button is chosen. Dim response As HttpResponseMessage = Await client.GetAsync("https://msdn.microsoft.com/library/dd470362.aspx", ct) ' Retrieve the website contents from the HttpResponseMessage. Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync() ' The result of the method is the length of the downloaded website. Return urlContents.Length End FunctionWenn Sie das Programm nicht abbrechen, wird die folgende Ausgabe erzeugt:
Ready to download. Length of the downloaded string: 158125.Wenn Sie die Schaltfläche "Abbrechen " auswählen, bevor das Programm den Download des Inhalts abgeschlossen hat, erzeugt das Programm die folgende Ausgabe:
Ready to download. Download canceled.
Eine Aufgabenliste abbrechen
Sie können das vorherige Beispiel erweitern, um viele Aufgaben abzubrechen, indem Sie die gleiche CancellationTokenSource Instanz mit den einzelnen Vorgängen zuordnen. Wenn Sie die Schaltfläche "Abbrechen " auswählen, brechen Sie alle Aufgaben ab, die noch nicht abgeschlossen sind.
Herunterladen des Beispiels
Sie können das vollständige Windows Presentation Foundation (WPF)-Projekt aus dem Async-Beispiel herunterladen: Optimieren Sie Ihre Anwendung , und führen Sie dann die folgenden Schritte aus.
Dekomprimieren Sie die heruntergeladene Datei, und starten Sie Dann Visual Studio.
Wählen Sie auf der Menüleiste "Datei", "Öffnen", "Projekt/Projektmappe" aus.
Öffnen Sie im Dialogfeld "Projekt öffnen" den Ordner mit dem Beispielcode, den Sie dekomprimiert haben, und öffnen Sie dann die Lösungsdatei (.sln) für AsyncFineTuningVB.
Öffnen Sie im Projektmappen-Explorer das Kontextmenü für das CancelAListOfTasks-Projekt, und wählen Sie dann Als Startprojekt festlegen aus.
Wählen Sie die F5-TASTE aus, um das Projekt auszuführen.
Wählen Sie die STRG+F5-Tasten aus, um das Projekt auszuführen, ohne es zu debuggen.
Wenn Sie das Projekt nicht herunterladen möchten, können Sie die MainWindow.xaml.vb Dateien am Ende dieses Themas überprüfen.
Erstellen des Beispiels
Um das Beispiel selbst zu erweitern, befolgen Sie schritt für Schritt die Anweisungen im Abschnitt "Herunterladen des Beispiels", wählen Sie " CancelATask " aber als Startprojekt aus. Fügen Sie dem Projekt die folgenden Änderungen hinzu. Sternchen markieren die Änderungen im Programm.
Fügen Sie eine Methode zum Erstellen einer Liste von Webadressen hinzu.
' ***Add a method that creates a list of web addresses. Private Function SetUpURLList() As List(Of String) Dim urls = New List(Of String) From { "https://msdn.microsoft.com", "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 FunctionRufen Sie die Methode in
AccessTheWebAsyncauf.' ***Call SetUpURLList to make a list of web addresses. Dim urlList As List(Of String) = SetUpURLList()Fügen Sie die folgende Schleife hinzu
AccessTheWebAsync, um jede Webadresse in der Liste zu verarbeiten.' ***Add a loop to process the list of web addresses. For Each url In urlList ' GetAsync returns a Task(Of HttpResponseMessage). ' Argument ct carries the message if the Cancel button is chosen. ' ***Note that the Cancel button can cancel all remaining downloads. Dim response As HttpResponseMessage = Await client.GetAsync(url, ct) ' Retrieve the website contents from the HttpResponseMessage. Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync() resultsTextBox.Text &= vbCrLf & $"Length of the downloaded string: {urlContents.Length}." & vbCrLf NextDa
AccessTheWebAsyncdie Längen anzeigt, muss die Methode nichts zurückgeben. Entfernen Sie die Return-Anweisung, und ändern Sie den Rückgabetyp der Methode in Task anstelle von Task<TResult>.Async Function AccessTheWebAsync(ct As CancellationToken) As TaskRufen Sie die Methode über
startButton_Clickauf, indem Sie eine Anweisung anstelle eines Ausdrucks verwenden.Await AccessTheWebAsync(cts.Token)Wenn Sie das Programm nicht abbrechen, wird die folgende Ausgabe erzeugt:
Length of the downloaded string: 35939. Length of the downloaded string: 237682. Length of the downloaded string: 128607. Length of the downloaded string: 158124. Length of the downloaded string: 204890. Length of the downloaded string: 175488. Length of the downloaded string: 145790. Downloads complete.Wenn Sie die Schaltfläche "Abbrechen " auswählen, bevor die Downloads abgeschlossen sind, enthält die Ausgabe die Länge der Downloads, die vor dem Abbruch abgeschlossen wurden.
Length of the downloaded string: 35939. Length of the downloaded string: 237682. Length of the downloaded string: 128607. Downloads canceled.
Vollständige Beispiele
Die folgenden Abschnitte enthalten den Code für jedes der vorherigen Beispiele. Beachten Sie, dass Sie einen Verweis für System.Net.Http hinzufügen müssen.
Sie können die Projekte aus dem Async-Beispiel herunterladen: Optimieren Ihrer Anwendung.
Abbrechen eines Vorgangsbeispiels
Der folgende Code ist die vollständige MainWindow.xaml.vb Datei für das Beispiel, das eine einzelne Aufgabe abbricht.
' Add an Imports directive and a reference for System.Net.Http.
Imports System.Net.Http
' Add the following Imports directive for System.Threading.
Imports System.Threading
Class MainWindow
' ***Declare a System.Threading.CancellationTokenSource.
Dim cts As CancellationTokenSource
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs)
' ***Instantiate the CancellationTokenSource.
cts = New CancellationTokenSource()
resultsTextBox.Clear()
Try
' ***Send a token to carry the message if cancellation is requested.
Dim contentLength As Integer = Await AccessTheWebAsync(cts.Token)
resultsTextBox.Text &=
vbCrLf & $"Length of the downloaded string: {contentLength}." & vbCrLf
' *** If cancellation is requested, an OperationCanceledException results.
Catch ex As OperationCanceledException
resultsTextBox.Text &= vbCrLf & "Download canceled." & vbCrLf
Catch ex As Exception
resultsTextBox.Text &= vbCrLf & "Download failed." & vbCrLf
End Try
' ***Set the CancellationTokenSource to Nothing when the download is complete.
cts = Nothing
End Sub
' ***Add an event handler for the Cancel button.
Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)
If cts IsNot Nothing Then
cts.Cancel()
End If
End Sub
' ***Provide a parameter for the CancellationToken.
Async Function AccessTheWebAsync(ct As CancellationToken) As Task(Of Integer)
Dim client As HttpClient = New HttpClient()
resultsTextBox.Text &=
vbCrLf & "Ready to download." & vbCrLf
' You might need to slow things down to have a chance to cancel.
Await Task.Delay(250)
' GetAsync returns a Task(Of HttpResponseMessage).
' ***The ct argument carries the message if the Cancel button is chosen.
Dim response As HttpResponseMessage = Await client.GetAsync("https://msdn.microsoft.com/library/dd470362.aspx", ct)
' Retrieve the website contents from the HttpResponseMessage.
Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync()
' The result of the method is the length of the downloaded website.
Return urlContents.Length
End Function
End Class
' Output for a successful download:
' Ready to download.
' Length of the downloaded string: 158125.
' Or, if you cancel:
' Ready to download.
' Download canceled.
Abbrechen einer Liste von Aufgaben (Beispiel)
Der folgende Code ist die vollständige MainWindow.xaml.vb Datei für das Beispiel, das eine Liste der Aufgaben abbricht.
' Add an Imports directive and a reference for System.Net.Http.
Imports System.Net.Http
' Add the following Imports directive for System.Threading.
Imports System.Threading
Class MainWindow
' Declare a System.Threading.CancellationTokenSource.
Dim cts As CancellationTokenSource
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs)
' Instantiate the CancellationTokenSource.
cts = New CancellationTokenSource()
resultsTextBox.Clear()
Try
' ***AccessTheWebAsync returns a Task, not a Task(Of Integer).
Await AccessTheWebAsync(cts.Token)
' ***Small change in the display lines.
resultsTextBox.Text &= vbCrLf & "Downloads complete."
Catch ex As OperationCanceledException
resultsTextBox.Text &= vbCrLf & "Downloads canceled." & vbCrLf
Catch ex As Exception
resultsTextBox.Text &= vbCrLf & "Downloads failed." & vbCrLf
End Try
' Set the CancellationTokenSource to Nothing when the download is complete.
cts = Nothing
End Sub
' Add an event handler for the Cancel button.
Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)
If cts IsNot Nothing Then
cts.Cancel()
End If
End Sub
' Provide a parameter for the CancellationToken.
' ***Change the return type to Task because the method has no return statement.
Async Function AccessTheWebAsync(ct As CancellationToken) As Task
Dim client As HttpClient = New HttpClient()
' ***Call SetUpURLList to make a list of web addresses.
Dim urlList As List(Of String) = SetUpURLList()
' ***Add a loop to process the list of web addresses.
For Each url In urlList
' GetAsync returns a Task(Of HttpResponseMessage).
' Argument ct carries the message if the Cancel button is chosen.
' ***Note that the Cancel button can cancel all remaining downloads.
Dim response As HttpResponseMessage = Await client.GetAsync(url, ct)
' Retrieve the website contents from the HttpResponseMessage.
Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync()
resultsTextBox.Text &=
vbCrLf & $"Length of the downloaded string: {urlContents.Length}." & vbCrLf
Next
End Function
' ***Add a method that creates a list of web addresses.
Private Function SetUpURLList() As List(Of String)
Dim urls = New List(Of String) From
{
"https://msdn.microsoft.com",
"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
End Class
' Output if you do not choose to cancel:
' Length of the downloaded string: 35939.
' Length of the downloaded string: 237682.
' Length of the downloaded string: 128607.
' Length of the downloaded string: 158124.
' Length of the downloaded string: 204890.
' Length of the downloaded string: 175488.
' Length of the downloaded string: 145790.
' Downloads complete.
' Sample output if you choose to cancel:
' Length of the downloaded string: 35939.
' Length of the downloaded string: 237682.
' Length of the downloaded string: 128607.
' Downloads canceled.