Annuler des tâches Asynch après une période spécifique (C# et Visual Basic)
Vous pouvez annuler une opération asynchrone après un certain temps à l'aide de la méthode CancellationTokenSource.CancelAfter si vous ne souhaitez pas attendre que l'opération se termine. Cette méthode planifie l'annulation de toutes les tâches associées qui ne sont pas terminées au cours de la période de temps qui est indiqué par l'expression CancelAfter.
Cet exemple s'ajoute au code développé dans Annuler une tâche Asynch ou une liste de tâches (C# et Visual Basic) pour télécharger une liste de sites Web et afficher la longueur du contenu de chacun d'eux.
Notes
Pour exécuter les exemples, Visual Studio 2012, Visual Studio 2013, Visual Studio Express 2012 pour Windows Desktop, Visual Studio Express 2013 pour Windows ou le .NET Framework 4.5 ou 4.5.1 doit être installé sur votre ordinateur.
Téléchargement de l'exemple
Vous pouvez télécharger le projet Windows Presentation Foundation (WPF) complet à partir de Exemple async : réglage de votre application et suivre ces étapes.
Décompressez le fichier que vous avez téléchargé, puis démarrez Visual Studio.
Dans la barre de menus, sélectionnez Fichier, Ouvrir, Projet/Solution.
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 solution (.sln) pour AsyncFineTuningCS ou AsyncFineTuningVB.
Dans l'Explorateur de solutions, ouvrez le menu contextuel du projet CancelAfterTime, puis choisissez Définir comme projet de démarrage.
Sélectionnez la touche F5 pour exécuter le projet.
Appuyez sur les touches Ctrl + F5 pour exécuter le projet sans le déboguer.
Exécutez le programme plusieurs fois pour vérifier que la sortie peut afficher la sortie pour tous les sites Web, aucun site Web, ou certains sites Web.
Si vous ne souhaitez pas télécharger le projet, vous pouvez examiner les fichiers complets MainWindow.xaml.vb et MainWindow.xaml.cs à la fin de cette rubrique.
Création de l'exemple
L'exemple de cette rubrique ajoute au projet développé dans Annuler une tâche Asynch ou une liste de tâches (C# et Visual Basic) pour annuler une liste de tâches. L'exemple utilise la même interface, bien que le bouton Annuler ne soit pas utilisé explicitement.
Pour générer l'exemple vous-même, pas à pas, suivez les instructions de la section « Téléchargement de l'exemple », mais choisissez CancelAListOfTasks comme Projet de démarrage. Ajoutez les modifications de cette rubrique à ce projet.
Pour spécifier un temps maximum avant que les tâches ne soient marquées comme annulées, ajoutez un appel à CancelAfter à startButton_Click, comme le montre l'exemple suivant. L'ajout est marqué avec des astérisques.
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
private async void startButton_Click(object sender, RoutedEventArgs e)
{
// 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 += "\r\nDownloads succeeded.\r\n";
}
catch (OperationCanceledException)
{
resultsTextBox.Text += "\r\nDownloads canceled.\r\n";
}
catch (Exception)
{
resultsTextBox.Text += "\r\nDownloads failed.\r\n";
}
cts = null;
}
Exécutez le programme plusieurs fois pour vérifier que la sortie peut afficher la sortie pour tous les sites Web, aucun site Web, ou certains sites Web. La sortie suivante est un exemple.
Length of the downloaded string: 35990.
Length of the downloaded string: 407399.
Length of the downloaded string: 226091.
Downloads canceled.
Exemple complet
Le code suivant est le texte complet du fichier MainWindow.xaml.vb ou MainWindow.xaml.cs de l'exemple. Les astérisques marquent les éléments ajoutés pour cet exemple.
Notez que vous devez ajouter une référence pour System.Net.Http.
Vous pouvez télécharger le projet à partir de Exemple async : réglage de votre 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/en-us/library/hh290138.aspx",
"https://msdn.microsoft.com/en-us/library/hh290140.aspx",
"https://msdn.microsoft.com/en-us/library/dd470362.aspx",
"https://msdn.microsoft.com/en-us/library/aa578028.aspx",
"https://msdn.microsoft.com/en-us/library/ms404677.aspx",
"https://msdn.microsoft.com/en-us/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.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// Add a using directive and a reference for System.Net.Http.
using System.Net.Http;
// Add the following using directive.
using System.Threading;
namespace CancelAfterTime
{
public partial class MainWindow : Window
{
// Declare a System.Threading.CancellationTokenSource.
CancellationTokenSource cts;
public MainWindow()
{
InitializeComponent();
}
private async void startButton_Click(object sender, RoutedEventArgs e)
{
// 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 += "\r\nDownloads succeeded.\r\n";
}
catch (OperationCanceledException)
{
resultsTextBox.Text += "\r\nDownloads canceled.\r\n";
}
catch (Exception)
{
resultsTextBox.Text += "\r\nDownloads failed.\r\n";
}
cts = null;
}
// You can still include a Cancel button if you want to.
private void cancelButton_Click(object sender, RoutedEventArgs e)
{
if (cts != null)
{
cts.Cancel();
}
}
async Task AccessTheWebAsync(CancellationToken ct)
{
// Declare an HttpClient object.
HttpClient client = new HttpClient();
// Make a list of web addresses.
List<string> urlList = SetUpURLList();
foreach (var url in urlList)
{
// GetAsync returns a Task<HttpResponseMessage>.
// Argument ct carries the message if the Cancel button is chosen.
// Note that the Cancel button cancels all remaining downloads.
HttpResponseMessage response = await client.GetAsync(url, ct);
// Retrieve the website contents from the HttpResponseMessage.
byte[] urlContents = await response.Content.ReadAsByteArrayAsync();
resultsTextBox.Text +=
String.Format("\r\nLength of the downloaded string: {0}.\r\n", urlContents.Length);
}
}
private List<string> SetUpURLList()
{
List<string> urls = new List<string>
{
"https://msdn.microsoft.com",
"https://msdn.microsoft.com/library/windows/apps/br211380.aspx",
"https://msdn.microsoft.com/en-us/library/hh290136.aspx",
"https://msdn.microsoft.com/en-us/library/ee256749.aspx",
"https://msdn.microsoft.com/en-us/library/ms404677.aspx",
"https://msdn.microsoft.com/en-us/library/ff730837.aspx"
};
return urls;
}
}
// Sample Output:
// Length of the downloaded string: 35990.
// Length of the downloaded string: 407399.
// Length of the downloaded string: 226091.
// Downloads canceled.
}
Voir aussi
Tâches
Procédure pas à pas : accès au Web avec Async et Await (C# et Visual Basic)
Concepts
Programmation asynchrone avec Async et Await (C# et Visual Basic)
Annuler une tâche Asynch ou une liste de tâches (C# et Visual Basic)
Réglage de votre application Async (C# et Visual Basic)