Leer en inglés

Compartir vía


CancellationToken Estructura

Definición

Propaga la notificación de que las operaciones deberían cancelarse.

public struct CancellationToken
public readonly struct CancellationToken
public readonly struct CancellationToken : IEquatable<System.Threading.CancellationToken>
[System.Runtime.InteropServices.ComVisible(false)]
public struct CancellationToken
Herencia
CancellationToken
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, el TaskFactory 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 canceló, el 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.

Comentarios

Permite CancellationToken la cancelación cooperativa entre subprocesos, elementos de trabajo del grupo de subprocesos o Task objetos. Para crear un token de cancelación, cree una instancia de un CancellationTokenSource objeto , que administra los tokens de cancelación recuperados de su CancellationTokenSource.Token propiedad. Después, pase el token de cancelación a cualquier número de subprocesos, tareas o operaciones que deben recibir aviso de cancelación. No se puede usar el token para iniciar la cancelación. Cuando el objeto propietario llama a CancellationTokenSource.Cancel, la IsCancellationRequested propiedad de cada copia del token de cancelación se establece trueen . Los objetos que reciben la notificación pueden responder de la manera adecuada.

Para obtener más información y ejemplos de código, consulte Cancelación en subprocesos administrados.

Constructores

Propiedades

CanBeCanceled

Obtiene si este token es capaz de existir en el estado cancelado.

IsCancellationRequested

Obtiene si se ha solicitado la cancelación para este token.

None

Devuelve un valor CancellationToken vacío.

WaitHandle

Obtiene un WaitHandle que se señala cuando el token se cancela.

Métodos

Equals(CancellationToken)

Determina si la instancia de CancellationToken actual es igual que el token especificado.

Equals(Object)

Determina si la instancia de CancellationToken actual es igual que la instancia de Object especificada.

GetHashCode()

Sirve como función hash de un objeto CancellationToken.

Register(Action, Boolean)

Registra un delegado que se invocará cuando se cancele este objeto CancellationToken.

Register(Action)

Registra un delegado que se invocará cuando se cancele este objeto CancellationToken.

Register(Action<Object,CancellationToken>, Object)

Registra un delegado al que se llamará cuando se cancele este CancellationToken .

Register(Action<Object>, Object, Boolean)

Registra un delegado que se invocará cuando se cancele este objeto CancellationToken.

Register(Action<Object>, Object)

Registra un delegado que se invocará cuando se cancele este objeto CancellationToken.

ThrowIfCancellationRequested()

Produce OperationCanceledException si este token ha tenido una solicitud de cancelación.

UnsafeRegister(Action<Object,CancellationToken>, Object)

Registra un delegado al que se llamará cuando se cancele este CancellationToken .

UnsafeRegister(Action<Object>, Object)

Registra un delegado que se invoca cuando se cancela este objeto CancellationToken.

Operadores

Equality(CancellationToken, CancellationToken)

Determina si dos instancias de CancellationToken son iguales.

Inequality(CancellationToken, CancellationToken)

Determina si dos instancias de CancellationToken no son iguales.

Se aplica a

Producto Versiones
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Seguridad para subprocesos

Todos los miembros públicos y protegidos de CancellationToken son seguros para subprocesos y se pueden usar simultáneamente desde varios subprocesos.

Consulte también