Delen via


Asynchrone taken annuleren na een periode (Visual Basic)

U kunt een asynchrone bewerking na een bepaalde periode annuleren met behulp van de CancellationTokenSource.CancelAfter methode als u niet wilt wachten totdat de bewerking is voltooid. Met deze methode wordt de annulering van de bijbehorende taken gepland die niet binnen de periode zijn voltooid die door de CancelAfter expressie is aangewezen.

In dit voorbeeld wordt de code toegevoegd die is ontwikkeld in Ansync Task an Async Task of a List of Tasks (Visual Basic) om een lijst met websites te downloaden en de lengte van de inhoud van elke site weer te geven.

Notitie

Als u de voorbeelden wilt uitvoeren, moet Visual Studio 2012 of hoger en .NET Framework 4.5 of hoger op uw computer zijn geïnstalleerd.

Het voorbeeld downloaden

U kunt het volledige WPF-project (Windows Presentation Foundation) downloaden uit Async Sample: Uw toepassing verfijnen en vervolgens deze stappen uitvoeren.

  1. Decomprim het bestand dat u hebt gedownload en start Vervolgens Visual Studio.

  2. Kies Bestand, Openen, Project/Oplossing in de menubalk.

  3. Open in het dialoogvenster Project openen de map met de voorbeeldcode die u hebt gedecomprimeerd en open het oplossingsbestand (.sln) voor AsyncFineTuningVB.

  4. Open in Solution Explorer het snelmenu voor het project CancelAfterTime en kies Instellen als Opstartproject.

  5. Kies de F5-sleutel om het project uit te voeren.

    Kies de Ctrl+F5-toetsen om het project uit te voeren zonder fouten op te sporen.

  6. Voer het programma meerdere keren uit om te controleren of de uitvoer uitvoer kan weergeven voor alle websites, geen websites of sommige websites.

Als u het project niet wilt downloaden, kunt u het MainWindow.xaml.vb bestand aan het einde van dit onderwerp bekijken.

Het voorbeeld bouwen

Het voorbeeld in dit onderwerp wordt toegevoegd aan het project dat is ontwikkeld in Een asynchrone taak annuleren of een lijst met taken (Visual Basic) om een lijst met taken te annuleren. In het voorbeeld wordt dezelfde gebruikersinterface gebruikt, hoewel de knop Annuleren niet expliciet wordt gebruikt.

Als u het voorbeeld zelf wilt bouwen, volgt u stap voor stap de instructies in de sectie 'Het voorbeeld downloaden', maar kiest u CancelAListOfTasks als het opstartproject. Voeg de wijzigingen in dit onderwerp toe aan dat project.

Als u een maximale tijd wilt opgeven voordat de taken zijn gemarkeerd als geannuleerd, voegt u een aanroep toe aan CancelAfterstartButton_Click, zoals in het volgende voorbeeld wordt weergegeven. De toevoeging is gemarkeerd met sterretjes.

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

Voer het programma meerdere keren uit om te controleren of de uitvoer uitvoer kan weergeven voor alle websites, geen websites of sommige websites. De volgende uitvoer is een voorbeeld:

Length of the downloaded string: 35990.

Length of the downloaded string: 407399.

Length of the downloaded string: 226091.

Downloads canceled.

Volledig voorbeeld

De volgende code is de volledige tekst van het MainWindow.xaml.vb-bestand voor het voorbeeld. Sterretjes markeren de elementen die zijn toegevoegd voor dit voorbeeld.

U moet een verwijzing toevoegen voor System.Net.Http.

U kunt het project downloaden uit Async Sample: Uw toepassing verfijnen.

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

Zie ook