所以我在书中读到我已经通过CancellationTokenSource的任务,即使我在令牌上调用cancel也可以忽略它?什么?这是真的。我希望不是。 在MSDN中找不到任何明确的内容。
它完全使取消令牌对我没用,我会坚持使用我的thread.abort然后。
答案 0 :(得分:1)
是的,这是真的。要使用CancellationTokenSource,您的任务必须了解它。
例如,以下代码知道CancellationToken,因为它调用了令牌实例的ThrowIfCancellationRequested()方法:
var cts = new CancellationTokenSource();
SomeCancellableOperation(cts.Token);
...
public void SomeCancellableOperation(CancellationToken token) {
...
token.ThrowIfCancellationRequested();
...
}
我找到了上述代码片段及其中的一些说明in this question。
答案 1 :(得分:1)
是。正如in the documentation所述,CancellationToken
用于合作取消。
任务中的代码决定如何处理已请求取消的信息。它可以忽略它,或者它可以等待适当的点并在请求取消时抛出OperationCanceledException
。提供了一个帮助方法就是这样:
CancellationToken.ThrowIfCancellationRequested()
这比杀死一个线程更好(但是,除了Task != Thread
之外)。请参阅this question,了解为什么Thread.Abort
不是一个好主意。