CancellationToken — обработчик регистрации после запроса на отмену

При отсутствии строительства быстрого испытательного стенда; Я подумал, что быстро попрошу SO посмотреть, знает ли кто-нибудь этот ответ навскидку.

Кроме того, это может иметь дополнительное преимущество, заключающееся в информировании других пользователей, которые могут столкнуться с подобными ситуациями.

Допустим, у меня есть долгоживущий CancellationTokenSource со множеством различных компонентов, регистрирующих обработчики на CancellationToken.

Если запрашивается отмена, и все зарегистрированные обратные вызовы вызываются, а затем после этого регистрируется другой обработчик; обратный вызов отмены все еще срабатывает для этого нового обратного вызова в момент регистрации?

Заранее привет!


person Dave Lawrence    schedule 11.10.2013    source источник


Ответы (1)


Взгляните на документацию для CancellationToken.Register:

Если этот токен уже находится в отмененном состоянии, делегат будет запущен немедленно и синхронно. Любое исключение, сгенерированное делегатом, будет распространяться из этого вызова метода.

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

Рассмотрим следующее:

void RegisterBeforeCancel(CancellationToken token)
{
    token.Register(() => Console.WriteLine("Before cancel"));
}

void RegisterAfterCancel(CancellationToken token)
{
    token.Register(() => Console.WriteLine("After cancel"));
}

var cts = new CancellationTokenSource();

RegisterBeforeCancel(cts.Token);

cts.Cancel();

RegisterAfterCancel(cts.Token);

Вывод покажет:

Before cancel
After cancel
person Dustin Kingen    schedule 11.10.2013