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
|
16-Mavzu LINQ so’rovlar (1)
- Bu sahifa navigatsiya:
- Parallel operatsiyani bekor qilish.
- Foydalanilgan internet manbaalar
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 n 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling