Partager via


CancellationTokenSource Classe

Définition

Signale à un CancellationToken qu’il doit être annulé.

public ref class CancellationTokenSource : IDisposable
public ref class CancellationTokenSource sealed : IDisposable
public class CancellationTokenSource : IDisposable
[System.Runtime.InteropServices.ComVisible(false)]
public sealed class CancellationTokenSource : IDisposable
[System.Runtime.InteropServices.ComVisible(false)]
public class CancellationTokenSource : IDisposable
type CancellationTokenSource = class
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(false)>]
type CancellationTokenSource = class
    interface IDisposable
Public Class CancellationTokenSource
Implements IDisposable
Public NotInheritable Class CancellationTokenSource
Implements IDisposable
Héritage
CancellationTokenSource
Attributs
Implémente

Exemples

L’exemple suivant utilise un générateur de nombres aléatoires pour émuler une application de collecte de données qui lit 10 valeurs intégrales à partir de onze instruments différents. La valeur zéro indique que la mesure a échoué pour un instrument, auquel cas l’opération doit être annulée et aucune moyenne globale ne doit être calculée.

Pour gérer l’annulation possible de l’opération, l’exemple instancie un objet CancellationTokenSource qui génère un jeton d’annulation passé à un objet TaskFactory. L’objet TaskFactory passe à son tour le jeton d’annulation à chacune des tâches responsables de la collecte des lectures pour un instrument particulier. La méthode TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) est appelée pour s’assurer que la moyenne est calculée uniquement après que toutes les lectures ont été collectées avec succès. Si une tâche n’est pas terminée, car elle a été annulée, l’appel à la méthode TaskFactory.ContinueWhenAll lève une exception.

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      // Define the cancellation token.
      CancellationTokenSource source = new CancellationTokenSource();
      CancellationToken token = source.Token;

      Random rnd = new Random();
      Object lockObj = new Object();
      
      List<Task<int[]>> tasks = new List<Task<int[]>>();
      TaskFactory factory = new TaskFactory(token);
      for (int taskCtr = 0; taskCtr <= 10; taskCtr++) {
         int iteration = taskCtr + 1;
         tasks.Add(factory.StartNew( () => {
           int value;
           int[] values = new int[10];
           for (int ctr = 1; ctr <= 10; ctr++) {
              lock (lockObj) {
                 value = rnd.Next(0,101);
              }
              if (value == 0) { 
                 source.Cancel();
                 Console.WriteLine("Cancelling at task {0}", iteration);
                 break;
              }   
              values[ctr-1] = value; 
           }
           return values;
        }, token));   
      }
      try {
         Task<double> fTask = factory.ContinueWhenAll(tasks.ToArray(), 
         (results) => {
            Console.WriteLine("Calculating overall mean...");
            long sum = 0;
            int n = 0; 
            foreach (var t in results) {
               foreach (var r in t.Result) {
                  sum += r;
                  n++;
               }
            }
            return sum/(double) n;
         } , token);
         Console.WriteLine("The mean is {0}.", fTask.Result);
      }   
      catch (AggregateException ae) {
         foreach (Exception e in ae.InnerExceptions) {
            if (e is TaskCanceledException)
               Console.WriteLine("Unable to compute mean: {0}", 
                  ((TaskCanceledException) e).Message);
            else
               Console.WriteLine("Exception: " + e.GetType().Name);
         }
      }
      finally {
         source.Dispose();
      }
   }
}
// Repeated execution of the example produces output like the following:
//       Cancelling at task 5
//       Unable to compute mean: A task was canceled.
//       
//       Cancelling at task 10
//       Unable to compute mean: A task was canceled.
//       
//       Calculating overall mean...
//       The mean is 5.29545454545455.
//       
//       Cancelling at task 4
//       Unable to compute mean: A task was canceled.
//       
//       Cancelling at task 5
//       Unable to compute mean: A task was canceled.
//       
//       Cancelling at task 6
//       Unable to compute mean: A task was canceled.
//       
//       Calculating overall mean...
//       The mean is 4.97363636363636.
//       
//       Cancelling at task 4
//       Unable to compute mean: A task was canceled.
//       
//       Cancelling at task 5
//       Unable to compute mean: A task was canceled.
//       
//       Cancelling at task 4
//       Unable to compute mean: A task was canceled.
//       
//       Calculating overall mean...
//       The mean is 4.86545454545455.
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      ' Define the cancellation token.
      Dim source As New CancellationTokenSource()
      Dim token As CancellationToken = source.Token

      Dim lockObj As New Object()
      Dim rnd As New Random

      Dim tasks As New List(Of Task(Of Integer()))
      Dim factory As New TaskFactory(token)
      For taskCtr As Integer = 0 To 10
         Dim iteration As Integer = taskCtr + 1
         tasks.Add(factory.StartNew(Function()
                                       Dim value, values(9) As Integer
                                       For ctr As Integer = 1 To 10
                                          SyncLock lockObj
                                             value = rnd.Next(0,101)
                                          End SyncLock
                                          If value = 0 Then 
                                             source.Cancel
                                             Console.WriteLine("Cancelling at task {0}", iteration)
                                             Exit For
                                          End If   
                                          values(ctr-1) = value 
                                       Next
                                       Return values
                                    End Function, token))   
         
      Next
      Try
         Dim fTask As Task(Of Double) = factory.ContinueWhenAll(tasks.ToArray(), 
                                                         Function(results)
                                                            Console.WriteLine("Calculating overall mean...")
                                                            Dim sum As Long
                                                            Dim n As Integer 
                                                            For Each t In results
                                                               For Each r In t.Result
                                                                  sum += r
                                                                  n+= 1
                                                               Next
                                                            Next
                                                            Return sum/n
                                                         End Function, token)
         Console.WriteLine("The mean is {0}.", fTask.Result)
      Catch ae As AggregateException
         For Each e In ae.InnerExceptions
            If TypeOf e Is TaskCanceledException
               Console.WriteLine("Unable to compute mean: {0}", 
                                 CType(e, TaskCanceledException).Message)
            Else
               Console.WriteLine("Exception: " + e.GetType().Name)
            End If   
         Next
      Finally
         source.Dispose()
      End Try                                                          
   End Sub
End Module
' Repeated execution of the example produces output like the following:
'       Cancelling at task 5
'       Unable to compute mean: A task was canceled.
'       
'       Cancelling at task 10
'       Unable to compute mean: A task was canceled.
'       
'       Calculating overall mean...
'       The mean is 5.29545454545455.
'       
'       Cancelling at task 4
'       Unable to compute mean: A task was canceled.
'       
'       Cancelling at task 5
'       Unable to compute mean: A task was canceled.
'       
'       Cancelling at task 6
'       Unable to compute mean: A task was canceled.
'       
'       Calculating overall mean...
'       The mean is 4.97363636363636.
'       
'       Cancelling at task 4
'       Unable to compute mean: A task was canceled.
'       
'       Cancelling at task 5
'       Unable to compute mean: A task was canceled.
'       
'       Cancelling at task 4
'       Unable to compute mean: A task was canceled.
'       
'       Calculating overall mean...
'       The mean is 4.86545454545455.

Remarques

À compter du .NET Framework 4, .NET Framework utilise un modèle unifié pour l’annulation coopérative d’opérations synchrones asynchrones ou longues qui impliquent deux objets :

Le modèle général d’implémentation du modèle d’annulation coopérative est le suivant :

Pour plus d’informations, consultez Annulation dans les threads managés.

Important

Ce type implémente l’interface IDisposable. Une fois que vous avez fini d’utiliser une instance du type, vous devez la supprimer directement ou indirectement. Pour supprimer le type directement, appelez sa méthode Dispose dans un bloc try/finally. Pour le supprimer indirectement, utilisez une construction de langage telle que using (en C#) ou Using (en Visual Basic). Pour plus d’informations, consultez la section « Utilisation d’un objet implémentant IDisposable » dans la rubrique de l’interface IDisposable.

Constructeurs

CancellationTokenSource()

Initialise une nouvelle instance de la classe CancellationTokenSource.

CancellationTokenSource(Int32)

Initialise une nouvelle instance de la classe CancellationTokenSource qui sera annulée après le délai spécifié en millisecondes.

CancellationTokenSource(TimeSpan)

Initialise une nouvelle instance de la classe CancellationTokenSource qui sera annulée après l’intervalle de temps spécifié.

CancellationTokenSource(TimeSpan, TimeProvider)

Initialise une nouvelle instance de la classe CancellationTokenSource qui sera annulée après la TimeSpanspécifiée.

Propriétés

IsCancellationRequested

Obtient si l’annulation a été demandée pour cette CancellationTokenSource.

Token

Obtient la CancellationToken associée à cette CancellationTokenSource.

Méthodes

Cancel()

Communique une demande d’annulation.

Cancel(Boolean)

Communique une demande d’annulation et spécifie si les rappels restants et les opérations annulables doivent être traités si une exception se produit.

CancelAfter(Int32)

Planifie une opération d’annulation sur cette CancellationTokenSource après le nombre spécifié de millisecondes.

CancelAfter(TimeSpan)

Planifie une opération d’annulation sur cette CancellationTokenSource après l’intervalle de temps spécifié.

CancelAsync()

Communique une demande d’annulation de façon asynchrone.

CreateLinkedTokenSource(CancellationToken)

Crée une CancellationTokenSource qui sera dans l’état annulé lorsque le jeton fourni est à l’état annulé.

CreateLinkedTokenSource(CancellationToken, CancellationToken)

Crée une CancellationTokenSource qui sera dans l’état annulé lorsque l’un des jetons sources est à l’état annulé.

CreateLinkedTokenSource(CancellationToken[])

Crée un CancellationTokenSource qui sera dans l’état annulé lorsque l’un des jetons sources dans le tableau spécifié est à l’état annulé.

CreateLinkedTokenSource(ReadOnlySpan<CancellationToken>)

Crée une CancellationTokenSource qui sera dans l’état annulé lorsque l’un des jetons sources est à l’état annulé.

Dispose()

Libère toutes les ressources utilisées par l’instance actuelle de la classe CancellationTokenSource.

Dispose(Boolean)

Libère les ressources non managées utilisées par la classe CancellationTokenSource et libère éventuellement les ressources managées.

Equals(Object)

Détermine si l’objet spécifié est égal à l’objet actuel.

(Hérité de Object)
GetHashCode()

Sert de fonction de hachage par défaut.

(Hérité de Object)
GetType()

Obtient la Type de l’instance actuelle.

(Hérité de Object)
MemberwiseClone()

Crée une copie superficielle du Objectactuel.

(Hérité de Object)
ToString()

Retourne une chaîne qui représente l’objet actuel.

(Hérité de Object)
TryReset()

Tente de réinitialiser l'CancellationTokenSource à utiliser pour une opération non liée.

S’applique à

Cohérence de thread

Tous les membres publics et protégés de CancellationTokenSource sont thread-safe et peuvent être utilisés simultanément à partir de plusieurs threads, à l’exception de Dispose(), qui ne doit être utilisé que lorsque toutes les autres opérations sur l’objet CancellationTokenSource ont terminé.

Voir aussi

  • d’annulation
  • d’annulation de tâche