CancellationTokenSource Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Sygnały do CancellationToken, że powinny zostać anulowane.
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
- Dziedziczenie
-
CancellationTokenSource
- Atrybuty
- Implementuje
Przykłady
W poniższym przykładzie użyto generatora liczb losowych do emulowania aplikacji do zbierania danych, która odczytuje 10 wartości całkowitych z jedenastu różnych instrumentów. Wartość zero wskazuje, że pomiar zakończył się niepowodzeniem dla jednego instrumentu, w takim przypadku operacja powinna zostać anulowana i nie należy obliczyć ogólnej średniej.
Aby obsłużyć możliwe anulowanie operacji, przykład tworzy wystąpienie obiektu CancellationTokenSource, który generuje token anulowania przekazywany do obiektu TaskFactory. Obiekt TaskFactory z kolei przekazuje token anulowania do każdego z zadań odpowiedzialnych za zbieranie odczytów dla określonego instrumentu. Metoda TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) jest wywoływana w celu zapewnienia, że średnia jest obliczana dopiero po pomyślnym zebraniu wszystkich odczytów. Jeśli zadanie nie zostało ukończone, ponieważ zostało anulowane, wywołanie metody TaskFactory.ContinueWhenAll zgłasza wyjątek.
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.
Uwagi
Począwszy od programu .NET Framework 4, program .NET Framework używa ujednoliconego modelu do kooperatywnego anulowania asynchronicznych lub długotrwałych operacji synchronicznych obejmujących dwa obiekty:
Obiekt CancellationTokenSource, który udostępnia token anulowania za pośrednictwem jego właściwości Token i wysyła komunikat anulowania przez wywołanie metody Cancel lub CancelAfter.
Obiekt CancellationToken, który wskazuje, czy zażądano anulowania.
Ogólny wzorzec wdrażania modelu anulowania współpracy to:
Utwórz wystąpienie obiektu CancellationTokenSource, który zarządza i wysyła powiadomienie o anulowaniu do poszczególnych tokenów anulowania.
Przekaż token zwrócony przez właściwość CancellationTokenSource.Token do każdego zadania lub wątku, który nasłuchuje anulowania.
Wywołaj metodę CancellationToken.IsCancellationRequested z operacji, które odbierają token anulowania. Podaj mechanizm dla każdego zadania lub wątku, aby odpowiadać na żądanie anulowania. Niezależnie od tego, czy chcesz anulować operację, i jak to zrobić, zależy od logiki aplikacji.
Wywołaj metodę CancellationTokenSource.Cancel, aby przekazać powiadomienie o anulowaniu. Spowoduje to ustawienie właściwości CancellationToken.IsCancellationRequested na każdej kopii tokenu anulowania w celu
true
.Wywołaj metodę Dispose po zakończeniu pracy z obiektem CancellationTokenSource.
Aby uzyskać więcej informacji, zobacz Anulowanie w zarządzanych wątkach.
Ważny
Ten typ implementuje interfejs IDisposable. Po zakończeniu korzystania z wystąpienia typu należy go usunąć bezpośrednio lub pośrednio. Aby usunąć typ bezpośrednio, wywołaj metodę Dispose w bloku try
/finally
. Aby usunąć go pośrednio, należy użyć konstrukcji języka, takiej jak using
(w języku C#) lub Using
(w Visual Basic). Aby uzyskać więcej informacji, zobacz sekcję "Using an Object that Implements IDisposable" (Używanie obiektu implementujące interfejs IDisposable) w temacie interfejsu IDisposable.
Konstruktory
CancellationTokenSource() |
Inicjuje nowe wystąpienie klasy CancellationTokenSource. |
CancellationTokenSource(Int32) |
Inicjuje nowe wystąpienie klasy CancellationTokenSource, która zostanie anulowana po upływie określonego opóźnienia w milisekundach. |
CancellationTokenSource(TimeSpan) |
Inicjuje nowe wystąpienie klasy CancellationTokenSource, która zostanie anulowana po określonym przedziale czasu. |
CancellationTokenSource(TimeSpan, TimeProvider) |
Inicjuje nowe wystąpienie klasy CancellationTokenSource, która zostanie anulowana po określonej TimeSpan. |
Właściwości
IsCancellationRequested |
Pobiera, czy zażądano anulowania dla tego CancellationTokenSource. |
Token |
Pobiera CancellationToken skojarzone z tym CancellationTokenSource. |
Metody
Cancel() |
Komunikuje żądanie anulowania. |
Cancel(Boolean) |
Komunikuje żądanie anulowania i określa, czy pozostałe wywołania zwrotne i operacje anulowania powinny być przetwarzane w przypadku wystąpienia wyjątku. |
CancelAfter(Int32) |
Planuje operację anulowania dla tej CancellationTokenSource po określonej liczbie milisekund. |
CancelAfter(TimeSpan) |
Planuje operację anulowania dla tego CancellationTokenSource po określonym przedziale czasu. |
CancelAsync() |
Komunikuje żądanie anulowania asynchronicznie. |
CreateLinkedTokenSource(CancellationToken) |
Tworzy CancellationTokenSource, które będą w stanie anulowanym, gdy podany token jest w stanie anulowanym. |
CreateLinkedTokenSource(CancellationToken, CancellationToken) |
Tworzy CancellationTokenSource, które będą w stanie anulowanym, gdy którykolwiek z tokenów źródłowych jest w stanie anulowanym. |
CreateLinkedTokenSource(CancellationToken[]) |
Tworzy CancellationTokenSource, które będą w stanie anulowanym, gdy którykolwiek z tokenów źródłowych w określonej tablicy jest w stanie anulowanym. |
CreateLinkedTokenSource(ReadOnlySpan<CancellationToken>) |
Tworzy CancellationTokenSource, które będą w stanie anulowanym, gdy którykolwiek z tokenów źródłowych jest w stanie anulowanym. |
Dispose() |
Zwalnia wszystkie zasoby używane przez bieżące wystąpienie klasy CancellationTokenSource. |
Dispose(Boolean) |
Zwalnia niezarządzane zasoby używane przez klasę CancellationTokenSource i opcjonalnie zwalnia zarządzane zasoby. |
Equals(Object) |
Określa, czy określony obiekt jest równy bieżącemu obiektowi. (Odziedziczone po Object) |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetType() |
Pobiera Type bieżącego wystąpienia. (Odziedziczone po Object) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Object. (Odziedziczone po Object) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
TryReset() |
Próbuje zresetować CancellationTokenSource do użycia na potrzeby niepowiązanej operacji. |
Dotyczy
Bezpieczeństwo wątkowe
Wszystkie publiczne i chronione elementy członkowskie CancellationTokenSource są bezpieczne wątkowo i mogą być używane współbieżnie z wielu wątków, z wyjątkiem Dispose(), które muszą być używane tylko wtedy, gdy wszystkie inne operacje na obiekcie CancellationTokenSource zostały ukończone.