Freigeben über


Asynchrone Aufgaben nach einem Bestimmten Zeitraum abbrechen (Visual Basic)

Sie können einen asynchronen Vorgang nach einem bestimmten Zeitraum abbrechen, indem Sie die CancellationTokenSource.CancelAfter Methode verwenden, wenn Sie nicht warten möchten, bis der Vorgang abgeschlossen ist. Diese Methode plant den Abbruch aller zugeordneten Vorgänge, die nicht innerhalb des Zeitraums abgeschlossen sind, der durch den CancelAfter Ausdruck festgelegt wird.

In diesem Beispiel wird der Code erweitert, der in Cancel an Async Task or a List of Tasks (Visual Basic) entwickelt wurde, um eine Liste von Websites herunterzuladen und die Länge der Inhalte jeder einzelnen anzuzeigen.

Hinweis

Um die Beispiele auszuführen, müssen Sie Visual Studio 2012 oder höher und .NET Framework 4.5 oder höher auf Ihrem Computer installiert haben.

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.

  1. Dekomprimieren Sie die heruntergeladene Datei, und starten Sie Dann Visual Studio.

  2. Wählen Sie auf der Menüleiste "Datei", "Öffnen", "Projekt/Projektmappe" aus.

  3. Ö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.

  4. Öffnen Sie im Projektmappen-Explorer das Kontextmenü für das CancelAfterTime-Projekt und wählen dann Als Startprojekt festlegen aus.

  5. 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.

  6. Führen Sie das Programm mehrmals aus, und überprüfen Sie dabei, ob die Ausgabe für alle, keine oder einige Websites angezeigt wird.

Wenn Sie das Projekt nicht herunterladen möchten, können Sie die MainWindow.xaml.vb Datei am Ende dieses Themas überprüfen.

Erstellen des Beispiels

Das Beispiel in diesem Thema baut auf dem Projekt auf, das unter Eine asynchrone Aufgabe oder Aufgabenliste abbrechen (Visual Basic) entwickelt wurde, um eine Aufgabenliste abzubrechen. Im Beispiel wird dieselbe Benutzeroberfläche verwendet, obwohl die Schaltfläche "Abbrechen " nicht explizit verwendet wird.

Um das Beispiel selbst zu erstellen, befolgen Sie schritt für Schritt die Anweisungen im Abschnitt "Herunterladen des Beispiels", wählen Sie aber CancelAListOfTasks als StartUp-Projekt aus. Fügen Sie die Änderungen in diesem Thema zu diesem Projekt hinzu.

Um eine maximale Zeit anzugeben, bevor die Vorgänge als abgebrochen markiert werden, fügen Sie einen Aufruf an CancelAfterstartButton_Click, wie im folgenden Beispiel gezeigt. Das Hinzufügen ist mit Sternchen gekennzeichnet.

Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs)

    ' Instantiate the CancellationTokenSource.
    cts = New CancellationTokenSource()

    resultsTextBox.Clear()

    Try
        ' ***Set up the CancellationTokenSource to cancel after 2.5 seconds. (You
        ' can adjust the time.)
        cts.CancelAfter(2500)

        Await AccessTheWebAsync(cts.Token)
        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

Führen Sie das Programm mehrmals aus, und überprüfen Sie dabei, ob die Ausgabe für alle, keine oder einige Websites angezeigt wird. Die folgende Ausgabe ist beispielhaft:

Length of the downloaded string: 35990.

Length of the downloaded string: 407399.

Length of the downloaded string: 226091.

Downloads canceled.

Vollständiges Beispiel

Der folgende Code ist der vollständige Text der MainWindow.xaml.vb-Datei für das Beispiel. Sternchen markieren die Elemente, die für dieses Beispiel hinzugefügt wurden.

Beachten Sie, dass Sie einen Verweis für System.Net.Http hinzufügen müssen.

Sie können das Projekt aus dem Async-Beispiel herunterladen: Optimieren Sie Ihre Anwendung.

' 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
            ' ***Set up the CancellationTokenSource to cancel after 2.5 seconds. (You
            ' can adjust the time.)
            cts.CancelAfter(2500)

            Await AccessTheWebAsync(cts.Token)
            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

    ' You can still include a Cancel button if you want to.
    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()

        ' Process each element in 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

' Sample output:

' Length of the downloaded string: 35990.

' Length of the downloaded string: 407399.

' Length of the downloaded string: 226091.

' Downloads canceled.

Siehe auch