3

这个MSDN 示例可以不使用 来编写CancellationTokenSource,可以直接使用 CancellationToken。

可以直接使用 aCancellationToken还是不应该做的事情?我没有在 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);
}
4

2 回答 2

6

不,您不能在CancellationToken不调用的情况下直接取消 a CancealltionTokenSource.Cancel,这意味着仅使用 Token 是没有用的(永远不会发出信号,您可以直接使用CancellationToken.None

取消工作在一方有方法通知取消(CancellationTokenSource)而另一方需要观察并被取消(使用CancellationToken)的情况下


*您可以简单地直接创建一个CancellationToken,同时传递一个bool表示令牌是否已被取消的符号,但您无法在应用程序的整个生命周期内更改它,因此用例非常罕见。

于 2014-06-12T00:02:47.483 回答
4

如果您不想取消,您可以简单地通过CancellationToken.None.

如果您正在编写公共异步 API,您应该让您的方法接受 aCancellationToken并将其传递给您调用的任何方法,以便您自己的调用者可以取消您。
(确保在取消的情况下回滚任何状态)

于 2014-06-12T00:02:07.110 回答