CancellationToken Struct
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Propaga la notifica di richiesta di annullamento delle operazioni.
public value class CancellationToken
public value class CancellationToken : IEquatable<System::Threading::CancellationToken>
public struct CancellationToken
public readonly struct CancellationToken
public readonly struct CancellationToken : IEquatable<System.Threading.CancellationToken>
[System.Runtime.InteropServices.ComVisible(false)]
public struct CancellationToken
type CancellationToken = struct
[<System.Runtime.InteropServices.ComVisible(false)>]
type CancellationToken = struct
Public Structure CancellationToken
Public Structure CancellationToken
Implements IEquatable(Of CancellationToken)
- Ereditarietà
- Attributi
- Implementazioni
Esempio
Nell'esempio seguente viene usato un generatore di numeri casuali per emulare un'applicazione di raccolta dati che legge 10 valori integrali da undici strumenti diversi. Un valore pari a zero indica che la misurazione non è riuscita per uno strumento, nel qual caso l'operazione deve essere annullata e non deve essere calcolata alcuna media complessiva.
Per gestire l'annullamento possibile dell'operazione, l'esempio crea un'istanza di un oggetto che genera un CancellationTokenSource token di annullamento passato a un TaskFactory oggetto. A sua volta, l'oggetto TaskFactory passa il token di annullamento a ognuna delle attività responsabili della raccolta di letture per uno strumento specifico. Il TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) metodo viene chiamato per assicurarsi che la media venga calcolata solo dopo che tutte le letture sono state raccolte correttamente. Se un'attività non è stata completata perché è stata annullata, il TaskFactory.ContinueWhenAll metodo genera un'eccezione.
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.
Commenti
Consente CancellationToken l'annullamento cooperativo tra thread, elementi di lavoro del pool di thread o Task oggetti. Si crea un token di annullamento creando un'istanza di un CancellationTokenSource oggetto, che gestisce i token di annullamento recuperati dalla relativa CancellationTokenSource.Token proprietà. Si passa quindi il token di annullamento a qualsiasi numero di thread, attività o operazioni che devono ricevere un avviso di annullamento. Impossibile usare il token per avviare l'annullamento. Quando l'oggetto proprietario chiama CancellationTokenSource.Cancel, la IsCancellationRequested proprietà in ogni copia del token di annullamento è impostata su true
. Gli oggetti che ricevono la notifica possono rispondere in qualsiasi modo appropriato.
Per altre informazioni ed esempi di codice, vedere Annullamento in Thread gestiti.
Costruttori
CancellationToken(Boolean) |
Inizializza CancellationToken. |
Proprietà
CanBeCanceled |
Ottiene un valore che indica se questo token è in grado di essere in stato di annullamento. |
IsCancellationRequested |
Ottiene un valore che indica se per questo token è stato richiesto l'annullamento. |
None |
Restituisce un valore CancellationToken vuoto. |
WaitHandle |
Ottiene un oggetto WaitHandle che viene segnalato quando il token viene annullato. |
Metodi
Equals(CancellationToken) |
Determina se l'istanza di CancellationToken corrente è uguale al token specificato. |
Equals(Object) |
Determina se l'istanza di CancellationToken corrente è uguale all'oggetto Object specificato. |
GetHashCode() |
Viene usato come funzione hash per un oggetto CancellationToken. |
Register(Action) |
Registra un delegato che verrà chiamato quando questo oggetto CancellationToken viene annullato. |
Register(Action, Boolean) |
Registra un delegato che verrà chiamato quando questo oggetto CancellationToken viene annullato. |
Register(Action<Object,CancellationToken>, Object) |
Registra un delegato che verrà chiamato quando CancellationToken viene annullato. |
Register(Action<Object>, Object) |
Registra un delegato che verrà chiamato quando questo oggetto CancellationToken viene annullato. |
Register(Action<Object>, Object, Boolean) |
Registra un delegato che verrà chiamato quando questo oggetto CancellationToken viene annullato. |
ThrowIfCancellationRequested() |
Genera un oggetto OperationCanceledException se è stato richiesto l'annullamento di questo token. |
UnsafeRegister(Action<Object,CancellationToken>, Object) |
Registra un delegato che verrà chiamato quando CancellationToken viene annullato. |
UnsafeRegister(Action<Object>, Object) |
Registra un delegato che viene chiamato quando questo oggetto CancellationToken viene annullato. |
Operatori
Equality(CancellationToken, CancellationToken) |
Determina se due istanze di CancellationToken sono uguali. |
Inequality(CancellationToken, CancellationToken) |
Determina se due istanze di CancellationToken non sono uguali. |
Si applica a
Thread safety
Tutti i membri pubblici e protetti di CancellationToken sono thread-safe e possono essere usati simultaneamente da più thread.