Bog'liq CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C
Глава.27 .Асинхронные.вычислительные.операции
state => Console.WriteLine("Name={0}",
CallContext.LogicalGetData("Name")));
// Восстанавливаем копирование контекста исполнения потока метода Main
// на случай будущей работы с другими потоками из пула
ExecutionContext.RestoreFlow();
...
Console.ReadLine();
}
Результат компиляции и запуска этого кода:
Name=Jeffrey
Name=
Пока мы обсуждаем только запрет копирования контекста исполнения при вы-
зове метода
ThreadPool.QueueUserWorkItem
, но этот прием используется как при
работе с объектами
Task
(см. раздел «Задания» данной главы), так и при иниции-
ровании асинхронных операций ввода-вывода (о них речь идет в главе 28).
скоординированная отмена Платформа .NET предлагает стандартный паттерн операций отмены. Этот паттерн
является
скоординированным (cooperative), то есть требует явной поддержки от-
мены операций. Другими словами, как код, выполняющий отменяемую операцию,
так и код, пытающийся реализовать отмену, должны относиться к типам, о которых
рассказывается в этом разделе. Так как необходимость отмены занимающих много
времени вычислительных операций не вызывает сомнения, к вашим вычислитель-
ным операциям имеет смысл добавить возможность отмены. О том, как это сделать,
мы и поговорим в этом разделе. Но начать следует с описания двух основных типов
из библиотеки FCL, входящих в состав стандартного паттерна скоординированной
отмены.
Для начала потребуется объект
System.Threading.CancellationTokenSource
.
Вот как выглядит данный класс:
public sealed class CancellationTokenSource : IDisposable { // Ссылочный тип
public CancellationTokenSource();
public Boolean IsCancellationRequested { get; }
public CancellationToken Token { get; }
public void Cancel(); // Вызывает Cancel с аргументом false
public void Cancel(Boolean throwOnFirstException);
...
}
Этот объект содержит все состояния, необходимые для управляемой отмены.
После создания объекта
CancellationTokenSource
(ссылочный тип) получить
753 Скоординированная.отмена
один или несколько экземпляров
CancellationToken
(значимый тип) можно из
свойства
Token
. Затем они передаются операциям, поддерживающим отмену. Вот
наиболее полезные члены значимого типа
CancellationToken
:
public struct CancellationToken { // Значимый тип
public static CancellationToken None { get; } // Очень удобно
Boolean IsCancellationRequested { get; } // Вызывается операциями,
// не связанными с Task
public void ThrowIfCancellationRequested(); // Вызван операциями,
// связанными с Task
// WaitHandle устанавливается при отмене CancellationTokenSource
public WaitHandle WaitHandle { get; }
// Члены GetHashCode, Equals, == и != не показаны
public Boolean CanBeCanceled { get; } // Редко используется
public CancellationTokenRegistration Register(
Action