取消令牌的使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了取消令牌的使用相关的知识,希望对你有一定的参考价值。
我正在尝试学习如何使用取消令牌取消任务。在这里,我已经为它编写了一个UnitTest,但我没有得到它的工作方式。
[TestMethod]
public async Task Task_should_not_run_when_token_cancelled_before_its_call()
{
var cts = new CancellationTokenSource();
var token = cts.Token;
cts.Cancel();
Debug.WriteLine("Calling Cancellable Method".ToUpper());
try
{
await CheckMeCalled(token);
}
catch (Exception expException)
{
}
}
private async Task CheckMeCalled(CancellationToken ct)
{
Debug.WriteLine("Before task delayed".ToUpper());
await Task.Delay(5000);
Debug.WriteLine("After task delayed".ToUpper());
}
在上面的测试中,我在调用cts.Cancel()
方法之前调用了CheckMeCalled
。所以它不应该取消运行。但它正在全力以赴。
我在某处读过:
如果“任务”未运行且您取消它,则它将不会进入运行状态,而是在您调用它时将其取消为已取消状态。
但这似乎并没有发生在这里。有人会向我解释一下吗?
答案
你添加的引用与通过Task
或Task.Run
创建一个新的Task.Factory.Startnew
有关。将CancellationToken
传递给方法时,必须在运行前主动检查令牌
private async Task CheckMeCalled(CancellationToken ct)
{
ct.ThrowIfCancellationRequested();
Debug.WriteLine("Before task delayed".ToUpper());
await Task.Delay(5000, ct);
Debug.WriteLine("After task delayed".ToUpper());
}
以下是Stephan Toub关于取消令牌和Task
的引用:
如果令牌在任务开始执行之前已请求取消,则任务将不会执行。它不会转换为Running,而是立即转换为Canceled。这样可以避免运行任务的成本,如果它在运行时只是被取消。
我还建议阅读NET 4 Cancellation Framework,以便对PFX团队的取消机制进行广泛的审查
另一答案
您必须手动检查令牌以查看是否请求取消。
附:
ct.IsCancellationRequested
以上是关于取消令牌的使用的主要内容,如果未能解决你的问题,请参考以下文章