CancellationTokenSource Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Signaler till en CancellationToken att den ska avbrytas.
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
- Arv
-
CancellationTokenSource
- Attribut
- Implementeringar
Exempel
I följande exempel används en slumptalsgenerator för att emulera ett program för datainsamling som läser 10 integralvärden från elva olika instrument. Ett värde på noll anger att mätningen har misslyckats för ett instrument, i vilket fall åtgärden ska avbrytas och inget övergripande medelvärde ska beräknas.
För att hantera eventuell annullering av åtgärden instansierar exemplet ett CancellationTokenSource objekt som genererar en annulleringstoken som skickas till ett TaskFactory objekt. Objektet TaskFactory skickar i sin tur annulleringstoken till var och en av de uppgifter som ansvarar för att samla in avläsningar för ett visst instrument. Metoden TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) anropas för att säkerställa att medelvärdet beräknas först när alla avläsningar har samlats in. Om en aktivitet inte har slutförts eftersom den har avbrutits utlöser anropet TaskFactory.ContinueWhenAll till metoden ett undantag.
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.
Kommentarer
Från och med .NET Framework 4 använder .NET Framework en enhetlig modell för kooperativ annullering av asynkrona eller långvariga synkrona åtgärder som omfattar två objekt:
Ett CancellationTokenSource objekt som tillhandahåller en annulleringstoken via dess Token egenskap och skickar ett meddelande om annullering genom att anropa dess Cancel eller CancelAfter metod.
Ett CancellationToken objekt som anger om annullering begärs.
Det allmänna mönstret för att implementera modellen för kooperativ annullering är:
Instansiera ett CancellationTokenSource objekt som hanterar och skickar aviseringar om annullering till de enskilda annulleringstoken.
Skicka token som returneras av egenskapen CancellationTokenSource.Token till varje uppgift eller tråd som lyssnar på annullering.
CancellationToken.IsCancellationRequested Anropa metoden från åtgärder som tar emot annulleringstoken. Ange en mekanism för varje uppgift eller tråd för att svara på en begäran om annullering. Om du väljer att avbryta en åtgärd och exakt hur du gör det beror på din programlogik.
Anropa metoden CancellationTokenSource.Cancel för att meddela om annullering. Detta anger egenskapen för CancellationToken.IsCancellationRequested varje kopia av annulleringstoken till
true.Dispose Anropa metoden när du är klar med CancellationTokenSource objektet.
Mer information finns i Annullering i hanterade trådar.
Important
Den här typen implementerar IDisposable gränssnittet. När du har använt en instans av typen bör du ta bort den direkt eller indirekt. Om du vill ta bort typen direkt anropar du dess Dispose metod i ett try/finally block. Om du vill ta bort det indirekt använder du en språkkonstruktion som using (i C#) eller Using (i Visual Basic). Mer information finns i avsnittet "Använda ett objekt som implementerar IDisposable" i IDisposable gränssnittet.
Konstruktorer
| Name | Description |
|---|---|
| CancellationTokenSource() |
Initierar en ny instans av CancellationTokenSource klassen. |
| CancellationTokenSource(Int32) |
Initierar en ny instans av CancellationTokenSource klassen som avbryts efter den angivna fördröjningen i millisekunder. |
| CancellationTokenSource(TimeSpan, TimeProvider) |
Initierar en ny instans av CancellationTokenSource klassen som kommer att avbrytas efter den angivna TimeSpan. |
| CancellationTokenSource(TimeSpan) |
Initierar en ny instans av CancellationTokenSource klassen som avbryts efter det angivna tidsintervallet. |
Egenskaper
| Name | Description |
|---|---|
| IsCancellationRequested |
Hämtar om annullering har begärts för detta CancellationTokenSource. |
| Token |
Hämtar associerad CancellationToken med den här CancellationTokenSource. |
Metoder
| Name | Description |
|---|---|
| Cancel() |
Meddelar en begäran om annullering. |
| Cancel(Boolean) |
Kommunicerar en begäran om annullering och anger om återstående återanrop och avbrutna åtgärder ska bearbetas om ett undantag inträffar. |
| CancelAfter(Int32) |
Schemalägger en avbokningsåtgärd för detta CancellationTokenSource efter det angivna antalet millisekunder. |
| CancelAfter(TimeSpan) |
Schemalägger en avbruten åtgärd för detta CancellationTokenSource efter det angivna tidsintervallet. |
| CancelAsync() |
Meddelar en begäran om annullering asynkront. |
| CreateLinkedTokenSource(CancellationToken, CancellationToken) |
Skapar en CancellationTokenSource som kommer att vara i avbrutet tillstånd när någon av källtoken är i avbrutet tillstånd. |
| CreateLinkedTokenSource(CancellationToken) |
Skapar en CancellationTokenSource som kommer att vara i avbrutet tillstånd när den angivna token är i avbrutet tillstånd. |
| CreateLinkedTokenSource(CancellationToken[]) |
Skapar en CancellationTokenSource som kommer att vara i avbrutet tillstånd när någon av källtoken i den angivna matrisen är i avbrutet tillstånd. |
| CreateLinkedTokenSource(ReadOnlySpan<CancellationToken>) |
Skapar en CancellationTokenSource som kommer att vara i avbrutet tillstånd när någon av källtoken är i avbrutet tillstånd. |
| Dispose() |
Släpper alla resurser som används av den aktuella instansen CancellationTokenSource av klassen. |
| Dispose(Boolean) |
Släpper de ohanterade resurser som används av CancellationTokenSource klassen och släpper eventuellt de hanterade resurserna. |
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |
| TryReset() |
Försöker återställa som CancellationTokenSource ska användas för en orelaterad åtgärd. |
Gäller för
Trådsäkerhet
Alla offentliga och skyddade medlemmar CancellationTokenSource i är trådsäkra och kan användas samtidigt från flera trådar, med undantag för Dispose(), som endast får användas när alla andra åtgärder i CancellationTokenSource objektet har slutförts.