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!

