CancellationTokenSource.Cancel Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
Isto CancellationTokenSource já foi resolvido.
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
Isto CancellationTokenSource já foi resolvido.
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.