Por que o CancellationToken é separado do CancellationTokenSource?

Eu estou procurando uma razão de porque struct .NET CancellationToken foi introduzida além da classe CancellationTokenSource. Compreendocomo a API deve ser usada, mas também quer entenderporque é projetado dessa maneira.

Por que nós temos:

var cts = new CancellationTokenSource();
SomeCancellableOperation(cts.Token);

...
public void SomeCancellableOperation(CancellationToken token) {
    ...
    token.ThrowIfCancellationRequested();
    ...
}

em vez de passar diretamente o CancellationTokenSource como:

var cts = new CancellationTokenSource();
SomeCancellableOperation(cts);

...
public void SomeCancellableOperation(CancellationTokenSource cts) {
    ...
    cts.ThrowIfCancellationRequested();
    ...
}

Essa é uma otimização de desempenho com base no fato de que as verificações de estado de cancelamento acontecem com mais frequência do que a passagem do token?

Para que o CancellationTokenSource possa acompanhar e atualizar o CancellationTokens, e para cada token a verificação de cancelamento é um acesso de campo local?

Dado que um bool volátil sem bloqueio é suficiente em ambos os casos, ainda não consigo ver por que isso seria mais rápido.

Obrigado!

questionAnswers(6)

yourAnswerToTheQuestion