I'm looking for a rationale of why .NET CancellationToken
struct was introduced in addition to CancellationTokenSource
class. I understand how the API is to be used, but want to also understand why it is designed that way.
I.e., why do we have:
var cts = new CancellationTokenSource();
SomeCancellableOperation(cts.Token);
...
public void SomeCancellableOperation(CancellationToken token) {
...
token.ThrowIfCancellationRequested();
...
}
instead of directly passing CancellationTokenSource
around like:
var cts = new CancellationTokenSource();
SomeCancellableOperation(cts);
...
public void SomeCancellableOperation(CancellationTokenSource cts) {
...
cts.ThrowIfCancellationRequested();
...
}
Is this a performance optimization based on the fact that cancellation state checks happen more frequently than passing the token around?
So that CancellationTokenSource
can keep track of and update CancellationTokens
, and for each token the cancellation check is a local field access?
Given that a volatile bool with no locking is enough in both cases, I still can't see why that would be faster.
Thanks!
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…