CancellationTokenSource.Cancel Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Übermittelt eine Abbruchanforderung.
Überlädt
Cancel() |
Übermittelt eine Abbruchanforderung. |
Cancel(Boolean) |
Teilt eine Anforderung für Abbruch mit und gibt an, ob verbleibende Rückrufe und abbrechbare Vorgänge verarbeitet werden sollen, wenn keine Ausnahme auftritt. |
Cancel()
Übermittelt eine Abbruchanforderung.
public:
void Cancel();
public void Cancel ();
member this.Cancel : unit -> unit
Public Sub Cancel ()
Ausnahmen
Diese CancellationTokenSource wurde verworfen.
Eine aggregierte Ausnahme, die alle Ausnahmen enthält, die von den registrierten Rückrufen für das zugeordnete CancellationToken ausgelöst werden.
Beispiele
Im folgenden Beispiel wird ein Zufallszahlengenerator verwendet, um eine Datensammlungsanwendung zu emulieren, die 10 integrale Werte aus elf verschiedenen Instrumenten liest. Ein Wert von Null gibt an, dass die Messung für ein Instrument fehlgeschlagen ist, in diesem Fall sollte der Vorgang abgebrochen werden und kein Gesamtwert berechnet werden.
Um den möglichen Abbruch des Vorgangs zu behandeln, instanziiert das Beispiel ein CancellationTokenSource -Objekt, das ein Abbruchtoken wird, die generiert an eine TaskFactory Objekt. Das TaskFactory Objekt übergibt wiederum das Abbruchtoken an jede der Aufgaben, die für das Sammeln von Lesevorgängen für ein bestimmtes Instrument verantwortlich sind. Die TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) Methode wird aufgerufen, um sicherzustellen, dass das Mittel nur berechnet wird, nachdem alle Lesewerte erfolgreich gesammelt wurden. Wenn eine Aufgabe nicht abgebrochen wurde, dann löst der Aufruf an die Methode TaskFactory.ContinueWhenAll eine Ausnahme aus.
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.
Hinweise
Der zugeordnete CancellationToken Wert wird über die Abbruchmeldung benachrichtigt und wechselt zu einem Zustand, IsCancellationRequested in dem true zurückgegeben wird.
Alle rückrufbaren oder abbruchbaren Vorgänge, die mit dem CancellationToken Vorgang registriert sind, werden ausgeführt.
Es wird empfohlen, dass abbruchbare Vorgänge und Rückrufe, die mit CancellationToken nicht ausgelösten Ausnahmen registriert sind, registriert sind.
Diese Überladung von Cancel aggregiert alle Ausnahmen, die in eine AggregateExceptionAusnahme ausgelöst werden, sodass ein Rückruf, der eine Ausnahme auslöst, nicht verhindert, dass andere registrierte Rückrufe ausgeführt werden.
Das Aufrufen dieser Methode hat denselben Effekt wie das Aufrufen Cancel(false)
.
Siehe auch
Gilt für
Cancel(Boolean)
Teilt eine Anforderung für Abbruch mit und gibt an, ob verbleibende Rückrufe und abbrechbare Vorgänge verarbeitet werden sollen, wenn keine Ausnahme auftritt.
public:
void Cancel(bool throwOnFirstException);
public void Cancel (bool throwOnFirstException);
member this.Cancel : bool -> unit
Public Sub Cancel (throwOnFirstException As Boolean)
Parameter
- throwOnFirstException
- Boolean
true
, wenn Ausnahmen sofort weitergegeben werden sollten; andernfalls false
.
Ausnahmen
Diese CancellationTokenSource wurde verworfen.
Eine aggregierte Ausnahme, die alle Ausnahmen enthält, die von den registrierten Rückrufen für das zugeordnete CancellationToken ausgelöst werden.
Hinweise
Der zugeordnete CancellationToken Vorgang wird von der Absagen benachrichtigt und wechselt zu einem Zustand, in dem IsCancellationRequested zurückgegeben true
wird.
Alle rückrufbaren oder abbruchbaren Vorgänge, die mit dem CancellationToken Vorgang registriert sind, werden ausgeführt. Rückrufe werden synchron in LIFO-Reihenfolge ausgeführt.
Es wird empfohlen, dass abbruchbare Vorgänge und Rückrufe, die mit CancellationToken nicht ausgelösten Ausnahmen registriert sind, registriert sind.
true
Wenn dies throwOnFirstException
der Fall ist, wird eine Ausnahme sofort aus dem Aufruf verteilt, um Cancelzu verhindern, dass die verbleibenden Rückrufe und abbrechenden Vorgänge verarbeitet werden.
false
Wenn throwOnFirstException
dies der Fall ist, wird diese Überladung alle Ausnahmen aggregiert, die in eine AggregateExceptionAusnahme ausgelöst werden, sodass ein Rückruf, der eine Ausnahme auslöst, nicht verhindert, dass andere registrierte Rückrufe ausgeführt werden.