可以在不使用CancellationTokenSource
的情况下编写此MSDN example,可以直接使用CancellationToken。
可以直接使用CancellationToken
还是永远不应该做的事情?我没有看到任何在MSDN上直接使用的例子,如果可以的话,这会让我变得更聪明。
更新
下面的Cod扩展了已接受的答案,其中包含一小组测试用例,证明CancellationToken是不可变的,因此如果需要控制令牌,则必须使用CancellationTokenSource。
值得一提的是,CancellationTokenSource 上的Token属性会在每次调用时返回新对象。
[TestMethod]
public void CancellationTokenProps() {
CancellationToken token = new CancellationToken(canceled:false);
Assert.IsFalse(token.IsCancellationRequested);
Assert.IsFalse(token.CanBeCanceled);
}
[TestMethod]
public void CancellationTokenSourceProps() {
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token1 = source.Token;
CancellationToken token2 = source.Token;
Assert.IsFalse(Object.ReferenceEquals(token1, token2));
Assert.IsTrue(token1.CanBeCanceled);
Assert.IsFalse(token1.IsCancellationRequested);
Assert.IsFalse(source.IsCancellationRequested);
source.Cancel(true);
Assert.IsTrue(source.IsCancellationRequested);
Assert.IsTrue(token1.IsCancellationRequested);
}
答案 0 :(得分:6)
没有。您无法在不调用CancellationToken
的情况下直接取消CancealltionTokenSource.Cancel
,这意味着仅使用令牌非常无用(它永远不会发出信号,您只能使用CancellationToken.None
)
如果一方有通知取消的方式(CancellationTokenSource
),另一方需要观察并取消(使用CancellationToken
)
*您 可以直接创建CancellationToken
,同时传递bool
,表示该令牌是否已被取消,但无法在整个应用程序的生命周期内改变它,因此用例非常罕见。
答案 1 :(得分:4)
如果您不想取消,只需传递CancellationToken.None
。
如果您正在编写公共异步API,则应该让您的方法接受CancellationToken
并将其传递给您调用的任何方法,以便您自己的来电者可以取消您。
(确保在取消的情况下回滚任何状态)