取消令牌的使用

时间:2014-07-11 13:57:34

标签: c# .net windows-phone-8 async-await cancellation-token

我正在尝试学习如何使用取消令牌取消任务。 在这里,我已经为它编写了一个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。所以它不应该取消运行。但它正在全力以赴。

我在某处读过:

  

如果“任务”未运行且您取消它,则它将不会进入运行状态,而是在您调用时将其取消为已取消状态。

但这似乎不会发生在这里。有人会向我解释一下吗?

2 个答案:

答案 0 :(得分:6)

您添加的报价与通过TaskTask.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团队的取消机制进行广泛的审查

答案 1 :(得分:1)

您必须手动检查令牌以查看是否请求取消。

使用:

ct.IsCancellationRequested