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



Download 6,27 Mb.
Pdf ko'rish
bet578/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   574   575   576   577   578   579   580   581   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C


Глава.27 .Асинхронные.вычислительные.операции
// Инициализация: задача обработала 0 байтов
return 0; // Присваивает taskLocalTotal начальное значение 0
},
(file, loopState, index, taskLocalTotal) => { // body: Вызывается 
// один раз для каждого элемента
// Получает размер файла и добавляет его к общему размеру
Int64 fileLength = 0;
FileStreamfs = null;
try {
fs = File.OpenRead(file);
fileLength = fs.Length;
}
catch (IOException) { /* Игнорируем файлы, к которым нет доступа */ }
finally { if (fs != null) fs.Dispose(); }
return taskLocalTotal + fileLength;
},
taskLocalTotal => { // localFinally: Вызывается один раз в конце задания
// Атомарное прибавление размера из задания к общему размеру
Interlocked.Add(ref masterTotal, taskLocalTotal);
});
return masterTotal;
}
Каждое задание управляет собственной промежуточной суммой (в переменной 
taskLocalTotal
) для данных ей файлов. После того как все задания завершатся, 
в безопасном в отношении потоков режиме обновляется общая сумма. Для этого 
используется метод 
Interlocked.Add
(подробно он рассматривается в главе 28). 
Так как промежуточная сумма для каждого задания своя, во время обработки эле-
ментов не требуется синхронизация потоков, которая отрицательно сказывается на 
производительности. Они возникают только на последнем этапе при вызове метода 
Interlocked.Add
. То есть снижение производительности происходит единовременно 
для задания, а не для рабочего элемента.
Вероятно, вы обратили внимание, что делегату 
body
передается объект 
ParallelLoopState
:
public class ParallelLoopState{
public void Stop();
public BooleanIsStopped { get; }
public void Break();
public Int64? LowestBreakIteration{ get; }
public BooleanIsExceptional { get; }
public BooleanShouldExitCurrentIteration { get; }
}
Каждое принимающее участие в работе задание получает собственный объект 
ParallelLoopState
и использует его для взаимодействия с другими работающими 


775
Встроенный.язык.параллельных.запросов
заданиями. Метод 
Stop
останавливает цикл, и все будущие запросы к свойству 
IsStopped
возвращают значение 
true
. Метод 
Break
заставляет цикл отказаться от 
обработки всех элементов, расположенных после выделенного. Предположим, что 
цикл 
ForEach
должен обработать 100 элементов, но после обработки пятого эле-
мента был вызван метод 
Break
. В итоге цикл гарантированно обрабатывает первые 
пять элементов и возвращает управление. Впрочем, это не исключает обработки 
дополнительных элементов. Свойство 
LowestBreakIteration
возвращает низшую 
итерацию цикла, на которой был вызван метод 
Break
. Если этот метод вообще не 
вызвался, свойство возвращает значение 
null
.
Свойство 
IsException
возвращает 
true
, если при обработке хотя бы одного 
элемента было вброшено необработанное исключение. Если обработка занимает 
много времени, ваш код может обратиться к свойству 
ShouldExitCurrentIteration

чтобы узнать, не нужно ли прервать текущую итерацию цикла. Свойство воз-
вращает значение 
true
, если был вызван метод 
Stop
или 
Break
, отменен объект 
CancellationTokenSource
(ссылка на него дается через свойство 
CancellationToken
класса 
ParallelOption
) или же обработка элемента привела к необработанному 
исключению.
Методы 
For
и 
ForEach
класса 
Parallel
возвращают экземпляр 
ParallelLoop-
Result
, который выглядит так:
public struct ParallelLoopResult{
// Возвращает false в случае преждевременного завершения операции
public Boolean IsCompleted { get; }
public Int64? LowestBreakIteration{ get; }
}
Результат работы цикла можно определить при помощи свойств. Если свойство 
IsCompleted
возвращает значение 
true
, значит, цикл пройден полностью, и все 
элементы обработаны. Если свойство 
IsCompleted
возвращает значение 
false

а свойство 
LowestBreakIteration
— значение 
null
, значит, каким-то из потоков был 
вызван метод 
Stop
. Если же в последнем случае значение, возвращаемое свойством 
LowestBreakIteration
, отлично от 
null
, значит, каким-то из потоков был вызван 
метод 
Break
. При этом возвращенное свойством 
LowestBreakIteration
значение 
типа 
Int64
указывает индекс последнего гарантированно обработанного элемента. 
Для корректного восстановления в случае выдачи исключения следует перехватить 
AggregateException
.

Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   574   575   576   577   578   579   580   581   ...   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