Annuler des tâches Asynch après une période spécifique (Visual Basic)Cancel Async Tasks after a Period of Time (Visual Basic)

Si vous ne souhaitez pas attendre la fin d’une opération asynchrone, vous pouvez l’annuler après une période spécifique à l’aide de la méthode CancellationTokenSource.CancelAfter.You can cancel an asynchronous operation after a period of time by using the CancellationTokenSource.CancelAfter method if you don't want to wait for the operation to finish. Cette méthode planifie l’annulation de toutes les tâches associées qui ne sont pas terminées au terme de la période indiquée par l’expression CancelAfter.This method schedules the cancellation of any associated tasks that aren’t complete within the period of time that’s designated by the CancelAfter expression.

Cet exemple s’appuie sur le code développé dans Annuler une tâche asynchrone ou une liste de tâches (Visual Basic) pour télécharger une liste de sites web et afficher la longueur du contenu de chacun d’eux.This example adds to the code that’s developed in Cancel an Async Task or a List of Tasks (Visual Basic) to download a list of websites and to display the length of the contents of each one.

Notes

Pour exécuter les exemples, Visual Studio 2012 ou ultérieur et .NET Framework 4.5 ou ultérieur doivent être installés sur votre ordinateur.To run the examples, you must have Visual Studio 2012 or later and the .NET Framework 4.5 or later installed on your computer.

Téléchargement de l'exempleDownloading the Example

Téléchargez l’intégralité des projets Windows Presentation Foundation (WPF) à partir de la page Async Sample: Fine Tuning Your Application (Exemple Async  : Réglage précis de votre application), puis suivez ces étapes.You can download the complete Windows Presentation Foundation (WPF) project from Async Sample: Fine Tuning Your Application and then follow these steps.

  1. Décompressez le fichier que vous avez téléchargé, puis démarrez Visual Studio.Decompress the file that you downloaded, and then start Visual Studio.

  2. Dans la barre de menus, choisissez Fichier, Ouvrir, Projet/Solution.On the menu bar, choose File, Open, Project/Solution.

  3. Dans la boîte de dialogue Ouvrir le projet, ouvrez le dossier contenant l’exemple de code que vous avez décompressé, puis ouvrez le fichier de solution (.sln) pour AsyncFineTuningVB.In the Open Project dialog box, open the folder that holds the sample code that you decompressed, and then open the solution (.sln) file for AsyncFineTuningVB.

  4. Dans l’Explorateur de solutions, ouvrez le menu contextuel du projet CancelAfterTime, puis choisissez Définir comme projet de démarrage.In Solution Explorer, open the shortcut menu for the CancelAfterTime project, and then choose Set as StartUp Project.

  5. Appuyez sur la touche F5 pour exécuter le projet.Choose the F5 key to run the project.

    Appuyez sur les touches Ctrl+F5 pour exécuter le projet sans le déboguer.Choose the Ctrl+F5 keys to run the project without debugging it.

  6. Exécutez le programme plusieurs fois pour vérifier qu’il peut afficher la sortie pour tous les sites web, aucun site web ou certains sites web.Run the program several times to verify that the output might show output for all websites, no websites, or some web sites.

Si vous ne souhaitez pas télécharger le projet, vous pouvez passer en revue le fichier MainWindow.xaml.vb à la fin de cette rubrique.If you don't want to download the project, you can review the MainWindow.xaml.vb file at the end of this topic.

Génération de l’exempleBuilding the Example

L’exemple de cette rubrique s’appuie sur le projet développé dans Annuler une tâche asynchrone ou une liste de tâches (Visual Basic) pour annuler une liste de tâches.The example in this topic adds to the project that's developed in Cancel an Async Task or a List of Tasks (Visual Basic) to cancel a list of tasks. Il utilise la même interface utilisateur, bien que le bouton Annuler ne soit pas utilisé explicitement.The example uses the same UI, although the Cancel button isn’t used explicitly.

Pour générer vous-même l’exemple, suivez les instructions pas à pas de la section « Téléchargement de l’exemple », mais choisissez CancelAListOfTasks comme Projet de démarrage.To build the example yourself, step by step, follow the instructions in the "Downloading the Example" section, but choose CancelAListOfTasks as the StartUp Project. Ajoutez les changements de cette rubrique à ce projet.Add the changes in this topic to that project.

Pour spécifier une durée maximale avant que les tâches ne soient marquées comme annulées, ajoutez un appel à CancelAfter à startButton_Click, comme l’illustre l’exemple suivant.To specify a maximum time before the tasks are marked as canceled, add a call to CancelAfter to startButton_Click, as the following example shows. L’ajout est signalé par des astérisques.The addition is marked with asterisks.

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  

Exécutez le programme plusieurs fois pour vérifier qu’il peut afficher la sortie pour tous les sites web, aucun site web ou certains sites web.Run the program several times to verify that the output might show output for all websites, no websites, or some web sites. La sortie suivante est un exemple.The following output is a sample.

Length of the downloaded string: 35990.  
  
Length of the downloaded string: 407399.  
  
Length of the downloaded string: 226091.  
  
Downloads canceled.  

Exemple completComplete Example

Le code suivant est le texte complet du fichier MainWindow.xaml.vb de l’exemple.The following code is the complete text of the MainWindow.xaml.vb file for the example. Des astérisques marquent les éléments ajoutés pour cet exemple.Asterisks mark the elements that were added for this example.

Notez que vous devez ajouter une référence pour System.Net.Http.Notice that you must add a reference for System.Net.Http.

Vous pouvez télécharger le projet à partir de la page Async Sample: Fine Tuning Your Application (Exemple Async : Réglage précis de votre application).You can download the project from Async Sample: Fine Tuning Your Application.

' 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 &=  
                String.Format(vbCrLf & "Length of the downloaded string: {0}." & vbCrLf, urlContents.Length)  
        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.  

Voir aussiSee also