Auf Englisch lesen

Freigeben über


CancellationTokenSource Klasse

Definition

Signalisiert eine CancellationToken, dass sie abgebrochen werden soll.

C#
public class CancellationTokenSource : IDisposable
C#
[System.Runtime.InteropServices.ComVisible(false)]
public sealed class CancellationTokenSource : IDisposable
C#
[System.Runtime.InteropServices.ComVisible(false)]
public class CancellationTokenSource : IDisposable
Vererbung
CancellationTokenSource
Attribute
Implementiert

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 abgeschlossen wurde, weil sie abgebrochen wurde, löst der Aufruf der TaskFactory.ContinueWhenAll-Methode eine Ausnahme aus.

C#
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.

Hinweise

Ab .NET Framework 4 verwendet .NET Framework ein einheitliches Modell für den kooperativen Abbruch asynchroner oder lang ausgeführter synchroner Vorgänge mit zwei Objekten:

Das allgemeine Muster für die Implementierung des kooperativen Abbruchmodells lautet:

Weitere Informationen finden Sie unter Abbruch in verwalteten Threads.

Wichtig

Dieser Typ implementiert die IDisposable Schnittstelle. Wenn Sie die Verwendung einer Instanz des Typs abgeschlossen haben, sollten Sie sie entweder direkt oder indirekt löschen. Rufen Sie zum direkten Löschen des Typs die Dispose-Methode in einem try/finally-Block auf. Verwenden Sie zum indirekten Löschen ein Sprachkonstrukt wie using (in C#) oder Using (in Visual Basic). Weitere Informationen finden Sie im Abschnitt "Verwenden eines Objekts, das IDisposable implementiert", im Thema zur IDisposable Schnittstelle.

Konstruktoren

CancellationTokenSource()

Initialisiert eine neue Instanz der CancellationTokenSource Klasse.

CancellationTokenSource(Int32)

Initialisiert eine neue Instanz der CancellationTokenSource Klasse, die nach der angegebenen Verzögerung in Millisekunden abgebrochen wird.

CancellationTokenSource(TimeSpan)

Initialisiert eine neue Instanz der CancellationTokenSource Klasse, die nach der angegebenen Zeitspanne abgebrochen wird.

CancellationTokenSource(TimeSpan, TimeProvider)

Initialisiert eine neue Instanz der CancellationTokenSource Klasse, die nach dem angegebenen TimeSpanabgebrochen wird.

Eigenschaften

IsCancellationRequested

Ruft ab, ob der Abbruch für diese CancellationTokenSourceangefordert wurde.

Token

Ruft die CancellationToken, die diesem CancellationTokenSourcezugeordnet ist.

Methoden

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.

CancelAfter(Int32)

Plant einen Abbruchvorgang für diese CancellationTokenSource nach der angegebenen Anzahl von Millisekunden.

CancelAfter(TimeSpan)

Plant einen Abbruchvorgang auf diesem CancellationTokenSource nach der angegebenen Zeitspanne.

CancelAsync()

Kommuniziert asynchron eine Anforderung für den Abbruch.

CreateLinkedTokenSource(CancellationToken)

Erstellt eine CancellationTokenSource, die sich im abgebrochenen Zustand befindet, wenn sich das angegebene Token im abgebrochenen Zustand befindet.

CreateLinkedTokenSource(CancellationToken, CancellationToken)

Erstellt eine CancellationTokenSource, die sich im Zustand "Abgebrochen" befindet, wenn sich eines der Quelltoken im abgebrochenen Zustand befindet.

CreateLinkedTokenSource(CancellationToken[])

Erstellt eine CancellationTokenSource, die sich im abgebrochenen Zustand befindet, wenn sich eines der Quelltoken im angegebenen Array im abgebrochenen Zustand befindet.

CreateLinkedTokenSource(ReadOnlySpan<CancellationToken>)

Erstellt eine CancellationTokenSource, die sich im Zustand "Abgebrochen" befindet, wenn sich eines der Quelltoken im abgebrochenen Zustand befindet.

Dispose()

Gibt alle Ressourcen frei, die von der aktuellen Instanz der CancellationTokenSource Klasse verwendet werden.

Dispose(Boolean)

Gibt die nicht verwalteten Ressourcen frei, die von der CancellationTokenSource Klasse verwendet werden, und gibt optional die verwalteten Ressourcen frei.

Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)
TryReset()

Versucht, die CancellationTokenSource zurückzusetzen, die für einen nicht verknüpften Vorgang verwendet werden sollen.

Gilt für:

Produkt Versionen
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Threadsicherheit

Alle öffentlichen und geschützten Member von CancellationTokenSource sind threadsicher und können gleichzeitig aus mehreren Threads verwendet werden, mit Ausnahme von Dispose(), die nur verwendet werden müssen, wenn alle anderen Vorgänge des CancellationTokenSource-Objekts abgeschlossen sind.

Weitere Informationen