相关疑难解决方法(0)

为什么CancellationToken与CancellationTokenSource是分开的?

我正在寻找除了CancellationTokenSource类之外还引入.NET CancellationToken结构的原因.我的理解是如何的API被使用,但想也明白为什么它就是这样设计的.

即,我们为什么要:

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

...
public void SomeCancellableOperation(CancellationToken token) {
    ...
    token.ThrowIfCancellationRequested();
    ...
}
Run Code Online (Sandbox Code Playgroud)

而不是直接传递CancellationTokenSource,如:

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

...
public void SomeCancellableOperation(CancellationTokenSource cts) {
    ...
    cts.ThrowIfCancellationRequested();
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是一个基于以下事实的性能优化:取消状态检查比传递令牌更频繁吗?

因此CancellationTokenSource可以跟踪和更新CancellationTokens,并且对于每个令牌,取消检查是本地字段访问?

鉴于两种情况下没有锁定的挥发性bool就足够了,我仍然无法理解为什么会更快.

谢谢!

.net multithreading task-parallel-library cancellationtokensource cancellation-token

119
推荐指数
4
解决办法
2万
查看次数