Avbryta en Async-uppgift eller en lista över uppgifter (Visual Basic)

Du kan konfigurera en knapp som du kan använda för att avbryta ett asynkront program om du inte vill vänta tills det har slutförts. Genom att följa exemplen i det här avsnittet kan du lägga till en annulleringsknapp i ett program som laddar ned innehållet på en webbplats eller en lista över webbplatser.

Exemplen använder det användargränssnitt som finjustering av ditt Async-program (Visual Basic) beskriver.

Kommentar

Om du vill köra exemplen måste du ha Visual Studio 2012 eller senare och .NET Framework 4.5 eller senare installerat på datorn.

Avbryt en aktivitet

I det första exemplet associeras knappen Avbryt med en enda nedladdningsuppgift. Om du väljer knappen medan programmet laddar ned innehåll avbryts nedladdningen.

Ladda ned exemplet

Du kan ladda ned hela WPF-projektet (Windows Presentation Foundation) från Async Sample: Fine Tuning Your Application och sedan följa dessa steg.

  1. Expandera filen som du laddade ned och starta sedan Visual Studio.

  2. På menyraden väljer du Arkiv, Öppna, Projekt/Lösning.

  3. I dialogrutan Öppna projekt öppnar du mappen som innehåller exempelkoden som du dekomprimerade och öppnar sedan lösningsfilen (.sln) för AsyncFineTuningVB.

  4. Öppna snabbmenyn för Projektet CancelATask i Solution Explorer och välj sedan Ange som startprojekt.

  5. Välj F5-nyckeln för att köra projektet.

    Välj Ctrl+F5-tangenterna för att köra projektet utan att felsöka det.

Om du inte vill ladda ned projektet kan du granska MainWindow.xaml.vb filer i slutet av det här avsnittet.

Skapa exemplet

Följande ändringar lägger till knappen Avbryt i ett program som laddar ned en webbplats. Om du inte vill ladda ned eller skapa exemplet kan du granska slutprodukten i avsnittet "Slutför exempel" i slutet av det här avsnittet. Asterisker markerar ändringarna i koden.

Om du vill skapa exemplet själv följer du anvisningarna i avsnittet "Ladda ned exemplet" steg för steg, men väljer StarterCode som StartUp-projekt i stället för CancelATask.

Lägg sedan till följande ändringar i MainWindow.xaml.vb filen för projektet.

  1. Deklarera en CancellationTokenSource variabel, cts, som finns i omfånget för alla metoder som har åtkomst till den.

    Class MainWindow
    
        ' ***Declare a System.Threading.CancellationTokenSource.
        Dim cts As CancellationTokenSource
    
  2. Lägg till följande händelsehanterare för knappen Avbryt . Händelsehanteraren använder CancellationTokenSource.Cancel metoden för att meddela cts när användaren begär annullering.

    ' ***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
    
  3. Gör följande ändringar i händelsehanteraren för startknappen , startButton_Click.

    • Instansiera CancellationTokenSource, cts.

      ' ***Instantiate the CancellationTokenSource.
      cts = New CancellationTokenSource()
      
    • I anropet till AccessTheWebAsync, som laddar ned innehållet på en angiven webbplats, skickar du CancellationTokenSource.Token egenskapen cts för som ett argument. Egenskapen Token sprider meddelandet om annullering begärs. Lägg till ett catch-block som visar ett meddelande om användaren väljer att avbryta nedladdningen. Följande kod visar ändringarna.

      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
      
  4. I AccessTheWebAsyncanvänder du överlagringen HttpClient.GetAsync(String, CancellationToken)GetAsync av metoden i HttpClient typen för att ladda ned innehållet på en webbplats. Pass ct, parametern CancellationToken för AccessTheWebAsync, som det andra argumentet. Token bär meddelandet om användaren väljer knappen Avbryt .

    Följande kod visar ändringarna i 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 Function
    
  5. Om du inte avbryter programmet genereras följande utdata:

    Ready to download.
    Length of the downloaded string: 158125.
    

    Om du väljer knappen Avbryt innan programmet har laddat ned innehållet genererar programmet följande utdata:

    Ready to download.
    Download canceled.
    

Avbryt en lista över uppgifter

Du kan utöka föregående exempel för att avbryta många aktiviteter genom att associera samma CancellationTokenSource instans med varje uppgift. Om du väljer knappen Avbryt avbryter du alla uppgifter som ännu inte har slutförts.

Ladda ned exemplet

Du kan ladda ned hela WPF-projektet (Windows Presentation Foundation) från Async Sample: Fine Tuning Your Application och sedan följa dessa steg.

  1. Expandera filen som du laddade ned och starta sedan Visual Studio.

  2. På menyraden väljer du Arkiv, Öppna, Projekt/Lösning.

  3. I dialogrutan Öppna projekt öppnar du mappen som innehåller exempelkoden som du dekomprimerade och öppnar sedan lösningsfilen (.sln) för AsyncFineTuningVB.

  4. I Solution Explorer öppnar du snabbmenyn för projektet CancelAListOfTasks och väljer sedan Ange som startprojekt.

  5. Välj F5-nyckeln för att köra projektet.

    Välj Ctrl+F5-tangenterna för att köra projektet utan att felsöka det.

Om du inte vill ladda ned projektet kan du granska MainWindow.xaml.vb filer i slutet av det här avsnittet.

Skapa exemplet

Om du vill utöka exemplet själv följer du anvisningarna i avsnittet "Ladda ned exemplet" steg för steg, men väljer AvbrytATask som StartUp-projekt. Lägg till följande ändringar i projektet. Asterisker markerar ändringarna i programmet.

  1. Lägg till en metod för att skapa en lista med webbadresser.

    ' ***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
    
  2. Anropa metoden i AccessTheWebAsync.

    ' ***Call SetUpURLList to make a list of web addresses.
    Dim urlList As List(Of String) = SetUpURLList()
    
  3. Lägg till följande loop i AccessTheWebAsync för att bearbeta varje webbadress i listan.

    ' ***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
    
  4. Eftersom AccessTheWebAsync visar längderna behöver metoden inte returnera något. Ta bort retursatsen och ändra returtypen för metoden till i stället för TaskTask<TResult>.

    Async Function AccessTheWebAsync(ct As CancellationToken) As Task
    

    Anropa metoden från startButton_Click med hjälp av en -instruktion i stället för ett uttryck.

    Await AccessTheWebAsync(cts.Token)
    
  5. Om du inte avbryter programmet genereras följande utdata:

    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.
    

    Om du väljer knappen Avbryt innan nedladdningarna har slutförts innehåller utdata längden på de nedladdningar som slutfördes före annulleringen.

    Length of the downloaded string: 35939.
    
    Length of the downloaded string: 237682.
    
    Length of the downloaded string: 128607.
    
    Downloads canceled.
    

Fullständiga exempel

Följande avsnitt innehåller koden för vart och ett av de föregående exemplen. Observera att du måste lägga till en referens för System.Net.Http.

Du kan ladda ned projekten från Async Sample: Finjustering av ditt program.

Avbryt ett aktivitetsexempel

Följande kod är den fullständiga MainWindow.xaml.vb filen för exemplet som avbryter en enskild uppgift.

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

Avbryt en lista med exempel på uppgifter

Följande kod är den fullständiga MainWindow.xaml.vb filen för det exempel som avbryter en lista över aktiviteter.

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

Se även