Net framework 5, а также среды Visual Studio 2012 и C#



Download 6,27 Mb.
Pdf ko'rish
bet560/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   556   557   558   559   560   561   562   563   ...   658
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 callback, Object state,
Boolean useSynchronizationContext); // Более простые варианты 
// перегрузки не показаны
}
Экземпляр 
CancellationToken
относится к упрощенному значимому типу, 
так как содержит всего одно закрытое поле: ссылку на свой объект 
Cancellation-
TokenSource
. Цикл вычислительной операции может периодически обращаться 
к свойству 
IsCancellationRequested
объекта 
CancellationToken
, чтобы узнать, 
не требуется ли раннее завершение его работы, то есть прерывание операции. Про-
цессор перестает совершать операции, в результате которых вы не заинтересованы. 
Рассмотрим пример кода:
internal static class CancellationDemo { 
public static void Main() { 
CancellationTokenSource cts = new CancellationTokenSource(); 
// Передаем операции CancellationToken и число
ThreadPool.QueueUserWorkItem(o => Count(cts.Token, 1000)); 
Console.WriteLine("Press to cancel the operation."); 
Console.ReadLine(); 
cts.Cancel(); // Если метод Count уже вернул управления, 
// Cancel не оказывает никакого эффекта
// Cancel немедленно возвращает управление, метод продолжает работу...
Console.ReadLine(); 

private static void Count(CancellationToken token, Int32 countTo) { 
for (Int32 count = 0; count if (token.IsCancellationRequested) { 
продолжение



754

Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   556   557   558   559   560   561   562   563   ...   658




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish