请求CancellationToken时,CancellationTokenSource是必需的吗?

Ser*_*i G 3 .net c# cancellationtokensource cancellation-token

这个MSDN示例可以在不使用的情况下编写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);
}
Run Code Online (Sandbox Code Playgroud)

i3a*_*non 6

不能.你不能CancellationToken直接取消没有调用CancealltionTokenSource.Cancel,这意味着只使用令牌是没用的(它永远不会发出信号,你可以CancellationToken.None改为使用)

取消工作在一方有通知取消(CancellationTokenSource)的手段,而另一方需要观察并取消(用a CancellationToken)


*你可以简单地创建一个CancellationToken直接创建一个bool表示令牌是否已被取消,但你不能在整个应用程序的生命周期中更改它,所以用例非常罕见.