Использование токена отмены

Я пытаюсь узнать, как отменить задачу, используя токен отмены. Здесь я написал для него 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. поэтому он не должен запускаться, поскольку он отменен. Но работает в полную силу.

Я где-то читал, что:

Если задача не запущена и вы отмените ее, то она не перейдет в состояние выполнения, а перейдет в состояние отмены, когда вы ее вызовете.

Но, похоже, здесь этого не происходит. Кто-нибудь объяснит мне это?


person loop    schedule 11.07.2014    source источник


Ответы (2)


Цитата, которую вы добавили, была связана с созданием нового 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());
}

Вот цитата Стефана Туба о токене отмены и Task:

Если токен был запрошен на отмену до того, как Задача начала выполняться, Задача не будет выполняться. Вместо перехода в «Выполняется» он сразу же перейдет в «Отменено». Это позволяет избежать затрат на выполнение задачи, если она все равно будет отменена во время выполнения.

Я также рекомендую прочитать Систему отмены NET 4. для широкой проверки механизма отмены командой PFX

person Yuval Itzchakov    schedule 11.07.2014

Вы должны вручную проверить токен, чтобы увидеть, была ли запрошена отмена.

С участием:

ct.IsCancellationRequested
person Smeegs    schedule 11.07.2014