16-Mavzu: linq so’rovlar. Reja: Parallel linq. Parallel linq ga kirish. AsParallel usuli. AsOrdered usuli


 Xatolarni qayta ishlash va operatsiyani bekor qilish


Download 152.19 Kb.
Pdf ko'rish
bet4/4
Sana18.06.2023
Hajmi152.19 Kb.
#1594030
1   2   3   4
Bog'liq
16-Mavzu LINQ so’rovlar (1)

3. Xatolarni qayta ishlash va operatsiyani bekor qilish. 
Parallel operatsiyalarni bajarishda xatolar ham paydo bo'lishi mumkin, 
ularning ishlashi o'ziga xos xususiyatlarga ega. Parallel ishlov berishda yig'ish 
qismlarga bo'linadi va har bir qism alohida ipda qayta ishlanadi. Biroq, agar iplardan 
birida xatolik yuzaga kelsa, tizim barcha iplarning bajarilishini to'xtatadi. Istisnolar 
tashlanganida, ularning barchasi bitta AggregateExceptionga birlashtiriladi. 
Masalan, obyektlar massivi faktorial usulga o‘tkazildi deylik, u nafaqat 
raqamlarni, balki satrlarni ham o‘z ichiga oladi: 
object[] numbers2 = new object[] { 1, 2, 3, 4, 5, "hello" };
var factorials = from n in numbers2.AsParallel() 
let x = (int)n 


select Factorial(x); 
try 

factorials.ForAll(n => Console.WriteLine(n)); 

catch (AggregateException ex) 

foreach (var e in ex.InnerExceptions) 

Console.WriteLine(e.Message); 


Massiv qatorni o'z ichiga olganligi sababli, translatsiyaga urinish 
muvaffaqiyatsiz tugadi va dastur Visual Studio'da nosozliklarni tuzatish rejimida 
ishga tushirilganda, ijro transformatsiya qatorida to'xtaydi. Va davom etgandan 
so'ng, istisno catch blokida ushlanadi va konsolda xato xabari ko'rsatiladi. 
Parallel operatsiyani bekor qilish. Ehtimol, operatsiyani yakunlashdan 
oldin tugatishimiz kerak bo'lishi mumkin. Bunday holda, CancellationToken 
parametr sifatida uzatiladigan WithCancellation() usulidan foydalanishimiz 
mumkin: 
static void Main(string[] args) 

CancellationTokenSource cts = new CancellationTokenSource(); 
new Task(() => 

Thread.Sleep(400); 
cts.Cancel(); 
}).Start(); 
try 

int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, }; 
var 
factorials 

from 

in 
numbers.AsParallel().WithCancellation(cts.Token) 
select Factorial(n); 
foreach (var n in factorials) 
Console.WriteLine(n); 

catch(OperationCanceledException ex) 

Console.WriteLine("Operatsiya to'xtatildi "); 

catch (AggregateException ex) 

if (ex.InnerExceptions != null) 



foreach (Exception e in ex.InnerExceptions) 
Console.WriteLine(e.Message); 


finally 

cts.Dispose(); 

Console.ReadLine(); 
}
static int Factorial(int x) 

int result = 1; 

for (int i = 1; i <= x; i++) 

result *= i; 

Console.WriteLine($"{x} sonining faktoriali {result} ga teng"); 
Thread.Sleep(1000); 
return result; 

Parallel bajariladigan vazifada cts.Cancel() usuli chaqiriladi, u operatsiyani 
tugatadi va OperationCanceledExceptionni chiqaradi: 
Bunday holda, AggregateException istisnosini qayta ishlash ham mantiqan 
to'g'ri keladi, chunki agar boshqa istisno parallel ravishda sodir bo'lsa, bu istisno
shuningdek OperationCanceledException bitta AggregateException obyekti ichiga 
joylashtiriladi. 
Foydalanilgan internet manbaalar 
1. 
https://metanit.com/sharp/tutorial/17.1.php
- Parallel LINQ. Parallel 
LINQ ga kirish. AsParallel usuli. 
2. 
https://metanit.com/sharp/tutorial/17.2.php
 - AsOrdered usuli 


3. 
https://metanit.com/sharp/tutorial/17.3.php
- Xatolarni qayta ishlash va 
operatsiyani bekor qilish. 

Download 152.19 Kb.

Do'stlaringiz bilan baham:
1   2   3   4




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