CancellationTokenSource Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Señala un objeto CancellationToken que debe cancelarse.
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
- Herencia
-
CancellationTokenSource
- Atributos
- Implementaciones
Ejemplos
En el ejemplo siguiente se usa un generador de números aleatorios para emular una aplicación de recopilación de datos que lee 10 valores enteros de once instrumentos diferentes. Un valor de cero indica que se ha producido un error en la medición de un instrumento, en cuyo caso se debe cancelar la operación y no se debe calcular ninguna media global.
Para controlar la posible cancelación de la operación, el ejemplo crea una instancia de un CancellationTokenSource objeto que genera un token de cancelación que se pasa a un TaskFactory objeto . A su vez, TaskFactory el objeto pasa el token de cancelación a cada una de las tareas responsables de recopilar lecturas de un instrumento determinado. Se TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) llama al método para asegurarse de que la media se calcula solo después de que todas las lecturas se hayan recopilado correctamente. Si una tarea no se ha completado porque se ha cancelado, la llamada al TaskFactory.ContinueWhenAll método produce una excepción.
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.
Comentarios
A partir de .NET Framework 4, .NET Framework usa un modelo unificado para la cancelación cooperativa de operaciones sincrónicas asincrónicas o de larga duración que implican dos objetos:
Objeto CancellationTokenSource , que proporciona un token de cancelación a través de su Token propiedad y envía un mensaje de cancelación llamando a su Cancel método o CancelAfter .
Objeto CancellationToken , que indica si se solicita la cancelación.
El patrón general para implementar el modelo de cancelación cooperativa es:
Crear una instancia de un objeto CancellationTokenSource, que administra y envía una notificación de cancelación a los tokens de cancelación individuales.
Pasar el token devuelto por la propiedad CancellationTokenSource.Token para cada tarea o el subproceso que realiza escuchas de cancelación.
Llame al CancellationToken.IsCancellationRequested método de las operaciones que reciben el token de cancelación. Proporcione un mecanismo para que cada tarea o subproceso responda a una solicitud de cancelación. Si decide cancelar una operación y cómo hacerlo, depende de la lógica de la aplicación.
Llamar al método CancellationTokenSource.Cancel para proporcionar una notificación de cancelación. Esto establece la CancellationToken.IsCancellationRequested propiedad en cada copia del token de cancelación en
true
.Llame al método Dispose cuando termine de usar el objeto CancellationTokenSource.
Para más información, consulte el tema sobre la cancelación en subprocesos administrados.
Importante
Este tipo implementa la interfaz IDisposable. Cuando haya terminado de usar una instancia del tipo, debe eliminarla directa o indirectamente. Para eliminar el tipo directamente, llame a su método Dispose en un bloque try
/finally
. Para deshacerse de él indirectamente, use una construcción de lenguaje como using
(en C#) o Using
(en Visual Basic). Para más información, vea la sección "Uso de objetos que implementan IDisposable" en el tema de la interfaz IDisposable.
Constructores
CancellationTokenSource() |
Inicializa una nueva instancia de la clase CancellationTokenSource. |
CancellationTokenSource(Int32) |
Inicializa una nueva instancia de la clase CancellationTokenSource que se cancela después del retraso especificado en milisegundos. |
CancellationTokenSource(TimeSpan) |
Inicializa una nueva instancia de la clase CancellationTokenSource que se cancela después del intervalo de tiempo especificado. |
CancellationTokenSource(TimeSpan, TimeProvider) |
Inicializa una nueva instancia de la CancellationTokenSource clase que se cancelará después del especificado TimeSpan. |
Propiedades
IsCancellationRequested |
Obtiene si se solicitó la cancelación de este CancellationTokenSource. |
Token |
Obtiene el objeto CancellationToken asociado a CancellationTokenSource. |
Métodos
Cancel() |
Comunica una solicitud de cancelación. |
Cancel(Boolean) |
Comunica una solicitud de cancelación y especifica si se deben procesar las devoluciones de llamada restantes y las operaciones cancelables si se produce una excepción. |
CancelAfter(Int32) |
Programa una operación de cancelación en este CancellationTokenSource después del número especificado de milisegundos. |
CancelAfter(TimeSpan) |
Programa una operación de cancelación en este CancellationTokenSource después de la duración especificada. |
CancelAsync() |
Comunica una solicitud de cancelación de forma asincrónica. |
CreateLinkedTokenSource(CancellationToken) |
Crea un elemento CancellationTokenSource que tendrá el estado cancelado cuando el token proporcionado se encuentre en estado cancelado. |
CreateLinkedTokenSource(CancellationToken, CancellationToken) |
Crea un CancellationTokenSource que tendrá el estado cancelado cuando alguno de los tokens de origen tenga el estado cancelado. |
CreateLinkedTokenSource(CancellationToken[]) |
Crea un objeto CancellationTokenSource que tendrá el estado cancelado cuando alguno de los tokens de origen del la matriz especificada tenga el estado cancelado. |
CreateLinkedTokenSource(ReadOnlySpan<CancellationToken>) |
Señala un objeto CancellationToken que debe cancelarse. |
Dispose() |
Libera todos los recursos usados por la instancia actual de la clase CancellationTokenSource. |
Dispose(Boolean) |
Libera los recursos no administrados utilizados por la clase CancellationTokenSource y, de forma opcional, libera los recursos administrados. |
Equals(Object) |
Determina si el objeto especificado es igual que el objeto actual. (Heredado de Object) |
GetHashCode() |
Sirve como la función hash predeterminada. (Heredado de Object) |
GetType() |
Obtiene el Type de la instancia actual. (Heredado de Object) |
MemberwiseClone() |
Crea una copia superficial del Object actual. (Heredado de Object) |
ToString() |
Devuelve una cadena que representa el objeto actual. (Heredado de Object) |
TryReset() |
Intenta restablecer el objeto CancellationTokenSource que se va a usar para una operación no relacionada. |
Se aplica a
Seguridad para subprocesos
Todos los miembros públicos y protegidos de CancellationTokenSource son seguros para subprocesos y se pueden usar simultáneamente desde varios subprocesos, con la excepción de Dispose(), que solo se debe usar cuando se hayan completado todas las demás operaciones del CancellationTokenSource objeto.
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de