3

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

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

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

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

Приветствия заранее!

ответ

7

Посмотрите на документацию для 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