c# – 请求CancellationToken时,CancellationTokenSource是必需的吗?
作者:互联网
这个MSDN example可以在不使用CancellationTokenSource的情况下编写,可以直接使用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);
}
解决方法:
不能.你不能在不调用CancealltionTokenSource.Cancel
的情况下直接取消CancellationToken
,这意味着只使用令牌是没用的(它永远不会发出信号,你只能使用CancellationToken.None)
取消适用于一方有通知取消的手段(CancellationTokenSource),另一方需要观察并取消(使用CancellationToken)
*您可以直接创建一个CancellationToken,同时传递一个bool,表示该令牌是否已被取消,但您无法在整个应用程序的生命周期内更改它,因此用例非常少见.
标签:c,net,cancellation-token,cancellationtokensource 来源: https://codeday.me/bug/20190717/1490879.html