День сто восемьдесят второй. #ЗаметкиНаПолях
Многопоточность
3. Скоординированная отмена
.NET предлагает стандартный шаблон операций отмены. Он называется скоординированным (cooperative), то есть необходима явная поддержка отмены операций. Это значит, что как код, выполняющий отменяемую операцию, так и код, пытающийся отменить операцию, должны использовать одинаковые типы.
В вызывающем коде создаётся объект
Вот наиболее полезные члены структуры
-
-
-
-
В примере ниже токен отмены передаётся методу
Источник: Джеффри Рихтер “CLR via C#”. 3-е изд. – СПб.: Питер, 2012. Глава 26.
Многопоточность
3. Скоординированная отмена
.NET предлагает стандартный шаблон операций отмены. Он называется скоординированным (cooperative), то есть необходима явная поддержка отмены операций. Это значит, что как код, выполняющий отменяемую операцию, так и код, пытающийся отменить операцию, должны использовать одинаковые типы.
В вызывающем коде создаётся объект
CancellationTokenSource
. C его помощью можно создать структуру CancellationToken
, которая передаётся вызываемому коду. Для отмены операции вызывается метод Cancel
объекта CancellationTokenSource
. Вот наиболее полезные члены структуры
CancellationToken
:-
bool IsCancellationRequested
– вызываемый код может периодически обращаться к этому свойству, чтобы узнать, не запрошена ли отмена операции;-
void ThrowIfCancellationRequested()
– метод используется в заданиях (Task
) аналогично предыдущему свойству;-
CancellationToken None
– статическое свойство, обозначающее отсутствие токена отмены, чтобы исключить возможность отмены операции;-
CancellationTokenRegistration Register(…)
– метод используется для регистрации одного или нескольких делегатов обратного вызова, которые будут вызваны при отмене операции. Возвращаемая методом структура CancellationTokenRegistration
содержит метод Dispose
, который позволяет отменить регистрацию.В примере ниже токен отмены передаётся методу
Compute
, внутри которого периодически проверяется свойство IsCancellationRequested
. Когда пользователь нажимает Enter, вызывается отмена операции, и на следующей итерации цикла он прерывается:static void Main(string[] args)Продолжение следует…
{
var cts = new CancellationTokenSource();
ThreadPool.QueueUserWorkItem(o => Compute(cts.Token, 1000));
Console.WriteLine("Нажмите <Enter> для отмены...");
Console.ReadLine();
cts.Cancel();
Console.ReadLine();
}
private static void Compute(CancellationToken token, int countTo)
{
for (int i = 0; i < countTo; i++)
{
if(token.IsCancellationRequested)
{
Console.WriteLine("Счёт отменён");
break;
}
Console.WriteLine(i);
Thread.Sleep(200);
}
Console.WriteLine("Счёт закончен");
}
Источник: Джеффри Рихтер “CLR via C#”. 3-е изд. – СПб.: Питер, 2012. Глава 26.