取消令牌的使用

本文关键字:令牌 取消 | 更新日期: 2023-09-27 18:12:41

我正在尝试学习如何使用取消令牌取消任务。这里,我已经为它写了一个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());
}

在上面的测试中,我在调用CheckMeCalled方法之前调用了cts.Cancel()。所以它不应该以取消的方式运行。但它已经达到了最大限度。

我在什么地方读到过:

如果Task没有运行并且你取消了它,那么当你调用它时,它将不会进入运行状态,而是进入取消状态。

但这似乎并没有发生在这里。有人能给我解释一下吗?

取消令牌的使用

您添加的引用与通过Task.RunTask.Factory.Startnew创建新的Task有关。当将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的引用:

如果令牌在任务开始执行之前请求取消,则任务将不会执行。而不是过渡到运行,它会立即过渡到取消。如果任务在运行时被取消,这可以避免运行任务的成本。

我还建议阅读。NET 4取消框架,以获得PFX团队对取消机制的广泛回顾

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

:

ct.IsCancellationRequested