Sollte ich IsCancellationRequested vom Token oder der Quelle verwenden, wenn beide verfügbar sind?

8

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%     
Calvin Fisher 06.05.2011, 14:01
quelle

3 Antworten

6

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.

    
Dan Bryant 06.05.2011, 14:27
quelle
1

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.

    
seairth 06.05.2011 14:15
quelle
1

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%     
Paul Michalik 06.05.2011 17:31
quelle