Wenn ich eine CancellationTokenSource habe, die sich noch im Umfang befindet, wenn ich nach einer Stornierung suche - z. B. wenn ich gerade eine Datenbankabfrage gemacht und das CancellationToken noch nicht an Tasks übergeben habe, um die Ergebnisse zu verarbeiten - sollte Ich greife auf IsCancellationRequested von der Quelle oder von seinem Token?
Mit anderen Worten, wenn beide Optionen verfügbar sind, was ist bevorzugt und warum?
1:
%Vor%2:
%Vor%In diesem speziellen Szenario glaube ich, dass die beiden im Wesentlichen gleichwertig sind. Ich würde es vorziehen, das Token nur dann zu verwenden, weil dies das Refactoring vereinfacht, wenn Sie später die Logik, die die Löschung prüft, von der Logik, die die Löschquelle erzeugt, abspalten. Um dieses Ziel zu erreichen, würde ich das Token in einer lokalen Referenz speichern und diese Referenz für die Überprüfung verwenden.
Normalerweise wird myCancellationTokenSource
verwendet, um die Löschung zu initiieren (z. B. durch einen übergeordneten Thread). myCancellationTokenSource.Token
ist die verknüpfte CancellationToken
, die Sie an etwas wie TaskFactory.StartNew()
übergeben würden. Die Aufgabe überwacht dann CancellationToken.IsCancellationRequested
, um festzustellen, wann sie herunterfahren soll.
Ich würde einen Token verwenden, obwohl zumindest für Variante 1 der Effekt wahrscheinlich derselbe ist. CancellationTokens sind schreibgeschützte Werttypen, die um den Client-Code herumgereicht werden sollen, während die CancellationTokenSource ein IDisposable mit einigen internen Ressourcen ist ... Aus Sicherheitsgründen würde ich es lieber so verwenden:
%Vor%Tags und Links c# task-parallel-library .net-4.0