CancellationTokenSource.Cancel Methode

Definition

Kommuniziert eine Anfrage zur Stornierung.

Überlädt

Name Beschreibung
Cancel()

Kommuniziert eine Anfrage zur Stornierung.

Cancel(Boolean)

Kommuniziert eine Anforderung für den Abbruch und gibt an, ob verbleibende Rückrufe und abbruchfähige Vorgänge verarbeitet werden sollen, wenn eine Ausnahme auftritt.

Cancel()

Quelle:
CancellationTokenSource.cs
Quelle:
CancellationTokenSource.cs
Quelle:
CancellationTokenSource.cs
Quelle:
CancellationTokenSource.cs
Quelle:
CancellationTokenSource.cs

Kommuniziert eine Anfrage zur Stornierung.

public:
 void Cancel();
public void Cancel();
member this.Cancel : unit -> unit
Public Sub Cancel ()

Ausnahmen

Eine Aggregatausnahme mit allen Ausnahmen, die von den registrierten Rückrufen für das zugeordnete Element CancellationTokenausgelö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 Gesamtmittelwert berechnet werden.

Um den möglichen Abbruch des Vorgangs zu behandeln, instanziiert das Beispiel ein CancellationTokenSource Objekt, das ein Abbruchtoken generiert, das an ein TaskFactory Objekt übergeben wird. 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 der Mittelwert erst berechnet wird, nachdem alle Messwerte erfolgreich gesammelt wurden. Wenn eine Aufgabe nicht abgebrochen wurde, löst der Aufruf der TaskFactory.ContinueWhenAll Methode 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 Vorgang CancellationToken wird über den Abbruch und übergänge zu einem Zustand benachrichtigt, in dem IsCancellationRequested "true" zurückgegeben wird.

Alle Rückrufe oder abbruchfähige Vorgänge, die bei der CancellationToken Ausführung registriert sind, werden ausgeführt, wenn sie noch nicht von einem vorherigen Aufruf Cancel()ausgeführt wurden. Nachfolgende Aufrufe, um Cancel() denselben Rückruf nicht erneut auszuführen, es sei denn, sie werden erneut registriert. (Vermeiden Sie mehrere Aufrufe Cancel(), da die Absicht eines solchen Codes häufig unklar ist.)

Rückrufe werden synchron in LIFO-Reihenfolge ausgeführt.

Es wird empfohlen, dass abbruchfähige Vorgänge und Rückrufe, die nicht mit CancellationToken Ausnahmen registriert sind, ausgelöst werden.

Diese Überladung von Cancel aggregiert alle ausnahmen, die in einen AggregateExceptionFall 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 die gleiche Auswirkung wie das Aufrufen von Cancel(false).

Weitere Informationen

Gilt für:

Cancel(Boolean)

Quelle:
CancellationTokenSource.cs
Quelle:
CancellationTokenSource.cs
Quelle:
CancellationTokenSource.cs
Quelle:
CancellationTokenSource.cs
Quelle:
CancellationTokenSource.cs

Kommuniziert eine Anforderung für den Abbruch und gibt an, ob verbleibende Rückrufe und abbruchfähige Vorgänge verarbeitet werden sollen, wenn eine 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

truewenn Ausnahmen sofort weitergegeben werden sollten; andernfalls . false

Ausnahmen

Eine Aggregatausnahme mit allen Ausnahmen, die von den registrierten Rückrufen für das zugeordnete Element CancellationTokenausgelöst werden.

Hinweise

Der zugeordnete Vorgang CancellationToken wird über den Abbruch und übergänge zu einem Zustand benachrichtigt, in dem IsCancellationRequested zurückgegeben wird true.

Alle Rückrufe oder abbruchfähige Vorgänge, die bei der CancellationToken Ausführung registriert sind, werden ausgeführt, wenn sie noch nicht von einem vorherigen Aufruf Cancel()ausgeführt wurden. Nachfolgende Aufrufe, um Cancel() denselben Rückruf nicht erneut auszuführen, es sei denn, sie werden erneut registriert. (Vermeiden Sie mehrere Aufrufe Cancel(), da die Absicht eines solchen Codes häufig unklar ist.)

Rückrufe werden synchron in LIFO-Reihenfolge ausgeführt.

Es wird empfohlen, dass abbruchfähige Vorgänge und Rückrufe, die nicht mit CancellationToken Ausnahmen registriert sind, ausgelöst werden.

Wenn throwOnFirstException dies der Grund ist true, wird eine Ausnahme sofort aus dem Aufruf Cancelweitergegeben und verhindert, dass die verbleibenden Rückrufe und abbruchfähigen Vorgänge verarbeitet werden.

Ist throwOnFirstException dies der Fall false, aggregiert diese Überladung alle Ausnahmen, die in einen AggregateExceptionFall ausgelöst werden, sodass ein Rückruf, der eine Ausnahme auslöst, nicht verhindert, dass andere registrierte Rückrufe ausgeführt werden.

Weitere Informationen

Gilt für: