取消令牌的使用

loo*_*oop 2 .net c# async-await windows-phone-8 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());
}
Run Code Online (Sandbox Code Playgroud)

在上面的测试i中调用cts.Cancel()之前调用CheckMeCalled方法.所以它不应该取消运行.但它正在全力以赴.

我在某处读过

cts.Cancel().

但这似乎并没有发生在这里.有人可以向我解释一下吗?任何帮助表示赞赏.欢呼:)

Yuv*_*kov 6

您添加的报价与创建新的Task通道Task.RunTask.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());
}
Run Code Online (Sandbox Code Playgroud)

以下是Stephan Toub关于取消令牌的引用Task:

如果令牌在任务开始执行之前已请求取消,则任务将不会执行.它不会转换为Running,而是立即转换为Canceled.这样可以避免运行任务的成本,如果它在运行时只是被取消.

我还建议阅读NET 4取消框架,以便PFX团队对取消机制进行广泛的审查