CancellationTokenSource Classe

Definição

Sinaliza CancellationToken que deve ser cancelado.

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
Herança
CancellationTokenSource
Atributos
Implementações

Exemplos

O exemplo seguinte utiliza um gerador de números aleatórios para emular uma aplicação de recolha de dados que lê 10 valores integrais de onze instrumentos diferentes. Um valor zero indica que a medição falhou para um instrumento, caso em que a operação deve ser cancelada e não deve ser calculada a média global.

Para lidar com o possível cancelamento da operação, o exemplo instancia um CancellationTokenSource objeto que gera um token de cancelamento que é passado a um TaskFactory objeto. O TaskFactory objeto, por sua vez, passa o token de cancelamento a cada uma das tarefas responsáveis por recolher leituras para um determinado instrumento. O TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) método é chamado para garantir que a média só é calculada depois de todas as leituras terem sido recolhidas com sucesso. Se uma tarefa não tiver sido concluída porque foi cancelada, a chamada ao TaskFactory.ContinueWhenAll método lança uma exceção.

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.

Observações

Começando com o .NET Framework 4, o .NET Framework utiliza um modelo unificado para o cancelamento cooperativo de operações assíncronas ou síncronas de longa duração que envolve dois objetos:

O padrão geral para a implementação do modelo de cancelamento cooperativo é:

Para obter mais informações, consulte Cancelamento em threads gerenciados.

Importante

Este tipo implementa a interface IDisposable. Quando terminar de usar uma instância do tipo, você deve descartá-la direta ou indiretamente. Para descartar o tipo diretamente, chame seu método Dispose em um bloco try/finally. Para descartá-lo indiretamente, use uma construção de linguagem como using (em C#) ou Using (em Visual Basic). Para obter mais informações, consulte a seção "Usando um objeto que implementa IDisposable" no tópico da IDisposable interface.

Construtores

Name Description
CancellationTokenSource()

Inicializa uma nova instância da CancellationTokenSource classe.

CancellationTokenSource(Int32)

Inicializa uma nova instância da CancellationTokenSource classe que será cancelada após o atraso especificado em milissegundos.

CancellationTokenSource(TimeSpan)

Inicializa uma nova instância da CancellationTokenSource classe que será cancelada após o período de tempo especificado.

Propriedades

Name Description
IsCancellationRequested

Percebe se foi pedido o cancelamento por causa disto CancellationTokenSource.

Token

Fica associado CancellationToken a isto CancellationTokenSource.

Métodos

Name Description
Cancel()

Comunica um pedido de cancelamento.

Cancel(Boolean)

Comunica um pedido de cancelamento e especifica se as chamadas restantes e operações canceláveis devem ser processadas caso ocorra uma exceção.

CancelAfter(Int32)

Agenda uma operação de cancelamento após CancellationTokenSource o número especificado de milissegundos.

CancelAfter(TimeSpan)

Agenda uma operação de cancelamento após CancellationTokenSource o intervalo de tempo especificado.

CreateLinkedTokenSource(CancellationToken, CancellationToken)

Cria um CancellationTokenSource que estará no estado cancelado quando qualquer um dos tokens de origem estiver no estado cancelado.

CreateLinkedTokenSource(CancellationToken[])

Cria um CancellationTokenSource que estará no estado cancelado quando qualquer um dos tokens de origem no array especificado estiver no estado cancelado.

Dispose()

Liberta todos os recursos usados pela instância atual da CancellationTokenSource classe.

Dispose(Boolean)

Liberta os recursos não geridos usados pela CancellationTokenSource classe e, opcionalmente, liberta os recursos geridos.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)

Aplica-se a

Segurança de Thread

Todos os membros públicos e protegidos de CancellationTokenSource são seguros para threads e podem ser usados simultaneamente a partir de múltiplas threads, com exceção de Dispose(), que só deve ser usado quando todas as outras operações no CancellationTokenSource objeto estiverem concluídas.

Ver também