Ich hatte die genaue Frage und wollte die Gründe für dieses Design verstehen.
Die akzeptierte Antwort brachte die Begründung genau richtig. Hier ist die Bestätigung des Teams, das diese Funktion entwickelt hat (Schwerpunkt Mine):
Zwei neue Typen bilden die Grundlage des Frameworks: A CancellationToken
ist eine Struktur, die einen „potenziellen Antrag auf Stornierung“ darstellt. Diese Struktur wird als Parameter an Methodenaufrufe übergeben, und die Methode kann sie abfragen oder einen Rückruf registrieren, der ausgelöst wird, wenn eine Stornierung angefordert wird. A CancellationTokenSource
ist eine Klasse, die den Mechanismus zum Initiieren einer Stornierungsanforderung bereitstellt und über eine Token
Eigenschaft zum Abrufen eines zugeordneten Tokens verfügt. Es wäre natürlich gewesen, diese beiden Klassen zu einer zu kombinieren, aber dieses Design ermöglicht es, die beiden Schlüsseloperationen (Initiieren einer Stornierungsanforderung vs. Beobachten und Reagieren auf Stornierung) sauber zu trennen. Insbesondere Methoden, die nur a annehmen, CancellationToken
können eine Stornierungsanforderung beobachten, aber keine initiieren.
Link: .NET 4 Cancellation Framework
Meiner Meinung nach ist die Tatsache, dass CancellationToken
man den Zustand nur beobachten und nicht ändern kann, äußerst kritisch. Sie können den Token wie eine Süßigkeit verteilen und müssen sich niemals Sorgen machen, dass jemand anderes als Sie ihn storniert. Es schützt Sie vor feindlichem Code von Drittanbietern. Ja, die Chancen stehen schlecht, aber ich persönlich mag diese Garantie.
Ich habe auch das Gefühl, dass es die API sauberer macht, versehentliche Fehler vermeidet und ein besseres Komponentendesign fördert.
Schauen wir uns die öffentliche API für beide Klassen an.
Wenn Sie sie kombinieren, werden beim Schreiben von LongRunningFunction Methoden wie die mehrfachen Überladungen von 'Abbrechen' angezeigt, die ich nicht verwenden sollte. Persönlich hasse ich es, auch die Dispose-Methode zu sehen.
Ich denke, das aktuelle Klassendesign folgt der "Pit of Success" -Philosophie. Es führt Entwickler dazu, bessere Komponenten zu erstellen, die mit Task
Stornierungen umgehen können, und sie dann auf vielfältige Weise zusammenzustellen, um komplizierte Workflows zu erstellen.
Lassen Sie mich Ihnen eine Frage stellen. Haben Sie sich gefragt, was der Zweck von Token ist? Registrieren? Es ergab für mich keinen Sinn. Und dann habe ich gelesen Stornierung in verwalteten Threads und alles wurde kristallklar.
Ich glaube, dass das Cancellation Framework Design in TPL absolut erstklassig ist.