CancellationTokenSource.Cancel Método

Definição

Comunica um pedido de cancelamento.

Sobrecargas

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.

Cancel()

Comunica um pedido de cancelamento.

public:
 void Cancel();
public void Cancel();
member this.Cancel : unit -> unit
Public Sub Cancel ()

Exceções

Uma exceção agregada contendo todas as exceções lançadas pelos callbacks registados no .CancellationToken

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 foi cancelada 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

O associado CancellationToken é notificado do cancelamento e transita para um estado onde IsCancellationRequested retorna verdadeiro.

Quaisquer callbacks ou operações canceláveis registadas com o CancellationToken são executadas, caso ainda não tenham sido executadas por uma chamada anterior para Cancel(). Chamadas subsequentes não Cancel() executam o mesmo callback novamente a menos que sejam reregistados. (Evite múltiplas chamadas para Cancel(), porque a intenção desse código é frequentemente pouco clara.)

Os callbacks são executados de forma síncrona na ordem LIFO.

Recomendamos que operações e callbacks canceláveis sejam registadas sem CancellationToken exceções de throw.

Esta sobrecarga de Cancel agrega quaisquer exceções lançadas num AggregateException, de modo que um callback que lança uma exceção não impeça que outros callbacks registados sejam executados.

Chamar este método tem o mesmo efeito que chamar Cancel(false).

Ver também

Aplica-se a

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.

public:
 void Cancel(bool throwOnFirstException);
public void Cancel(bool throwOnFirstException);
member this.Cancel : bool -> unit
Public Sub Cancel (throwOnFirstException As Boolean)

Parâmetros

throwOnFirstException
Boolean

true se as exceções se propagarem imediatamente; caso contrário, false.

Exceções

Uma exceção agregada contendo todas as exceções lançadas pelos callbacks registados no .CancellationToken

Observações

O associado CancellationToken é notificado do cancelamento e transita para um estado onde IsCancellationRequested retorna true.

Quaisquer callbacks ou operações canceláveis registadas com o CancellationToken são executadas, caso ainda não tenham sido executadas por uma chamada anterior para Cancel(). Chamadas subsequentes não Cancel() executam o mesmo callback novamente a menos que sejam reregistados. (Evite múltiplas chamadas para Cancel(), porque a intenção desse código é frequentemente pouco clara.)

Os callbacks são executados de forma síncrona na ordem LIFO.

Recomendamos que operações e callbacks canceláveis sejam registadas sem CancellationToken exceções de throw.

Se throwOnFirstException for true, uma exceção propagar-se-á imediatamente para fora da chamada para Cancel, impedindo que os callbacks restantes e operações canceláveis sejam processados.

Se throwOnFirstException for false, esta sobrecarga agrega quaisquer exceções lançadas num AggregateException, de modo que um callback que lança uma exceção não impedirá que outros callbacks registados sejam executados.

Ver também

Aplica-se a