Anulowanie zadań asynchronicznych po upływie czasu (Visual Basic)

Możesz anulować operację asynchroniczną po upływie czasu, używając metody , jeśli nie chcesz czekać CancellationTokenSource.CancelAfter na zakończenie operacji. Ta metoda planuje anulowanie wszystkich skojarzonych zadań, które nie zostały ukończone w czasie wyznaczonym przez CancelAfter wyrażenie.

W tym przykładzie dodano kod, który został opracowany w części Anulowanie zadania asynchronicznego lub Lista zadań (Visual Basic), aby pobrać listę witryn internetowych i wyświetlić długość zawartości każdego z nich.

Uwaga

Aby uruchomić przykłady, musisz mieć zainstalowany Visual Studio 2012 lub nowszy oraz .NET Framework 4.5 lub nowszy.

Pobieranie przykładu

Możesz pobrać kompletny projekt platformy Windows Presentation Foundation (WPF) z przykładu asynchronicznego: Dostrajanie aplikacji, a następnie wykonaj następujące kroki.

  1. Zdekompresuj pobrany plik, a następnie uruchom Visual Studio.

  2. Na pasku menu wybierz pozycję Plik, Otwórz, Project/Solution.

  3. W oknie dialogowym Project otwórz folder zawierający przykładowy kod, który został zdekompresowany, a następnie otwórz plik rozwiązania (sln) dla pliku AsyncFineTuningVB.

  4. W Eksplorator rozwiązań otwórz menu skrótów dla projektu CancelAfterTime, a następnie wybierz pozycję Ustaw jako start Project.

  5. Wybierz klawisz F5, aby uruchomić projekt.

    Naciśnij klawisze Ctrl+F5, aby uruchomić projekt bez debugowania.

  6. Uruchom program kilka razy, aby sprawdzić, czy dane wyjściowe mogą pokazywać dane wyjściowe dla wszystkich witryn internetowych, witryn internetowych ani niektórych witryn internetowych.

Jeśli nie chcesz pobierać projektu, możesz przejrzeć plik MainWindow.xaml.vb na końcu tego tematu.

Tworzenie przykładu

W tym temacie dodano przykład do projektu opracowanego w temacie Anulowanie zadania asynchronicznego lub Lista zadań (Visual Basic) w celu anulowania listy zadań. W przykładzie użyto tego samego interfejsu użytkownika, chociaż przycisk Anuluj nie jest używany jawnie.

Aby samodzielnie skompilować przykład, postępuj zgodnie z instrukcjami w sekcji "Pobieranie przykładu", ale wybierz pozycję CancelAListOfTasks jako Project . Dodaj zmiany w tym temacie do tego projektu.

Aby określić maksymalny czas przed oznaczeniem zadań jako anulowanych, dodaj wywołanie do , jak pokazano CancelAfter startButton_Click w poniższym przykładzie. Dodanie jest oznaczone gwiazdkami.

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

Uruchom program kilka razy, aby sprawdzić, czy dane wyjściowe mogą pokazywać dane wyjściowe dla wszystkich witryn internetowych, witryn internetowych ani niektórych witryn internetowych. Następujące dane wyjściowe to przykład:

Length of the downloaded string: 35990.

Length of the downloaded string: 407399.

Length of the downloaded string: 226091.

Downloads canceled.

Kompletny przykład

Poniższy kod to pełny tekst pliku MainWindow.xaml.vb na przykład. Gwiazdki oznaczają elementy, które zostały dodane w tym przykładzie.

Zwróć uwagę, że musisz dodać odwołanie do System.Net.Http .

Projekt można pobrać z przykładu asynchronicznego: Dostrajanie aplikacji.

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

Zobacz też