Task-alapú párhuzamosítás C# környezetben

Hasonló dokumentumok
Concurrency in Swing

Informatika terméktervezőknek

Pénzügyi algoritmusok

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

BME MOGI Gépészeti informatika 4.

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Cserép Máté

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Giachetta Roberto

Szoftvertechnológia alapjai Java előadások

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

A C# programozási nyelv alapjai

BME MOGI Gépészeti informatika 13.

Vizuális programozás gyakorlat

Objektumorientált programozás C# nyelven

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

C# Szálkezelés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Szálkezelés / 21

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

Objektumorientált programozás C# nyelven

Java Programozás 11. Ea: MVC modell

Java programozási nyelv 9. rész Kivételkezelés

BME MOGI Gépészeti informatika 1.

Kivételkezelés a C++ nyelvben Bevezetés

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Access adatbázis elérése OLE DB-n keresztül

SZERVER OLDALI JAVASCRIPT. 7. hét Promise, async, error rst callback, grunt

Java IX. telkezelés a Java-ban

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

Programozási nyelvek Java

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Java IX. telkezelés a Java-ban

Objektumorientált programozás C# nyelven III.

Osztályok. 4. gyakorlat

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

OOP és UML Áttekintés

BME MOGI Gépészeti informatika 7.

1. Alapok. Programozás II

BASH script programozás II. Vezérlési szerkezetek

Segédanyag: Java alkalmazások gyakorlat

Globális operátor overloading

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Bánsághi Anna

BME MOGI Gépészeti informatika 6.

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Szkriptnyelvek. 1. UNIX shell

A programozás alapjai 1 Rekurzió

Programozási nyelvek JAVA EA+GY 1. gyakolat

Kivételek, kivételkezelés a C++ nyelvben

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók

Objektumorientált Programozás VI.

INFORMATIKAI ALAPISMERETEK

Gregorics Tibor Modularizált programok C++ nyelvi elemei 1

Broadcast Service Widget

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Operációs rendszerek. Az Executive és a kernel Policy és mechanizmusok szeparálása Executive: policy - objektum kezelés Kernel: mechanizmusok:

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Programozási nyelvek és módszerek Java Thread-ek

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Java és web programozás

Java Programozás 3. Gy: Java GUI. Swing, AWT

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

Torna. A torna.csv UTF-8 kódolású állományban soronként egy versenyző eredményeit tároljuk. Az adatokat pontosvessző választja el egymástól.

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

AWK programozás, minták, vezérlési szerkezetek

BME MOGI Gépészeti informatika 5.

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Segédanyag: Java alkalmazások gyakorlat

.Net adatstruktúrák. Készítette: Major Péter








Delegátumok C#-ban Krizsán Zoltán iit

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Szoftvertechnolo gia gyakorlat

Overview. Service. Application Activity Activity 2 Activity 3. Fragment. Fragment. Fragment. Frag ment. Fragment. Broadcast Receiver

Powershell 2. gyakorlat

Programozás C++ -ban 2007/7

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

INFORMATIKA tétel 2018

Előszó A Windows alkalmazásfejlesztés rövid története A Windows életútja A Windows 8 paradigmaváltása... 16

Átírás:

Task-alapú párhuzamosítás C# környezetben OE-NIK 1

Task Aszinkron elvégzett feladat A háttérben egy Thread vagy egy ThreadPool egy eleme van: magasabb absztrakciós szinten dolgozunk ThreadPool Gyakorlatilag egy előre inicializált szálkészlet, amely használatával az egyes szálak létrehozása által okozott teljesítményvesztést enyhítjük. OE-NIK 2

Hagyományos szál vs. Task Használjunk hagyományos szálakat, ha: A szálnak a normálistól eltérő prioritással kell futnia a ThreadPool-on minden szál normál prioritással fut Előtérszálra van szükség minden ThreadPool szál háttérszál A szál extrém hosszú műveletet végez (pl. az alkalmazás teljes élettartama alatt futnia kell) Abort()-ra lehet szükség Minden más esetben Task ajánlott Könnyen alkalmazható, robosztus eszköz Széleskörű alkalmazási lehetőségek (feladatmegszakítás, kivételkezelés, scheduling, stb) OE-NIK 3

Task indítása Task task1 = new Task(new Action(PrintMessage)); Task task2 = new Task(delegate PrintMessage(); }); Task task3 = new Task(() => PrintMessage()); Task task4 = new Task(() => PrintMessage(); }); Lambda kifejezés Az anoním függvények egy típusa. Szintaxisának alapja a => operátor, amely a bemenetet és a kimenetet előállító kifejezést köti össze. Több paraméter esetén zárójelezni kell: SingleParamMathOp muvelet = x => x * x; double j = muvelet(5); TwoParamMathOp myfunc = (x, y) => x + y; double j = myfunc(5, 10); Ha nincs bemeneti paraméter, azt üres zárójelezéssel jelöljük: Action a = () => 5; 4

Task paraméterrel Taskok indítása paraméter nélkül, paraméterrel: A new Task Action-t vagy Action<object>-et vár el, a Task.Run csak Action-t! new Task(LongOperation).Start(); new Task(LongOperationWithParam, 15).Start(); Task t = Task.Run(() => LongOperation()); //.NET 4.5 Task t = Task.Run(() => LongOperationWithParam(15)); //.NET 4.5 Task t = new TaskFactory().StartNew(LongOperation); OE-NIK 5

Task visszatérési értékkel Taskok indítása visszatérési értékkel rendelkező művelet esetén: Task<int> task = new Task<int>(LongOperationWithReturnValue); task.start(); // Func<Tresult>! //... más műveletek... int result = task.result; Console.WriteLine(result); Az összes fenti módszerrel lehet visszatérési értékkel rendelkező Taskot indítani A Result tulajdonság megvárja a művelet végét (blokkol), ezért érdemes nem azonnal a Start után hívni (vagy lásd később) OE-NIK 6

Várakozás Taskra Bármilyen esetben, amikor a Task műveletére várni kell (pl. eredményt képez, tömböt feltölt, beállítást végez, fájlt ment ) task.wait(); //várakozás, míg kész (blokkol) Task.WaitAll(taskArray); //várakozás, míg mind kész (blokkol) Task.WaitAny(taskArray); //várakozás, míg legalább az egyik kész (blokkol) //vagy Task.WaitAll(task1, task2, task3); //mint fent Task.WaitAny(task1, task2, task3); //mint fent Hátrány: ezek a hívások mind blokkolnak Megoldás: Continuation-ök OE-NIK 7

Continuation-ök Az eredeti Task lefutása után egy új Task indul majd a megadott művelettel (a t az előző, befejeződött Taskra való referencia) Task<int> continuedtask = new Task<int>(LongOperationWithReturnValue); //nem blokkol, mint a Wait: continuedtask.continuewith(t => Console.WriteLine("The result was: " + t.result)); Feltételes indítás: //csak ha hiba nélkül futott az eredeti Task: continuedtask.continuewith(t => Console.WriteLine("The result was: " + t.result), TaskContinuationOptions.OnlyOnRanToCompletion); //csak ha cancelezték az eredeti Taskot: continuedtask.continuewith(t => Console.WriteLine("The task was canceled!"), TaskContinuationOptions.OnlyOnCanceled); //csak ha hibára futott az eredeti Task: continuedtask.continuewith(t => Console.WriteLine("The task threw " + "an exception: " + t.exception.innerexception), TaskContinuationOptions.OnlyOnFaulted); OE-NIK HP 8

Feladat: Prímszámkeresés Számoljuk meg, hogy az első N pozitív egész között hány prímszám található! Törekedjünk rá, hogy visszajelzést adjunk a haladásról! Vizsgáljuk meg a párhuzamosítási lehetőségeket! Több Task is alkalmazható? Emlékeztetőül: static bool PrimSzam(int szam) if (szam == 1) return false; if (szam == 2) return true; int limit = (int)math.sqrt(szam); for (int i = 3; i < limit; i++) if (szam % i == 0) return false; return true; } OE-NIK HP 9

Task hibakezelés Ha egy Taskban hiba történik, az Exception lenyelődik, és a Wait() vagy Result hívásakor dobódik el egy gyűjteményes Exception (AggregateException) formájában Egy Tasknak lehet több gyermek taskja is: több Exception is elképzelhető Az AggregateException példányban InnerExceptions gyűjteményben vannak a konkrét kivételpéldányok Task<int> taskwithexception = new Task<int>(LongOperationWithReturnValueAndException); taskwithexception.start(); try result = taskwithexception.result; } catch (AggregateException ex) foreach (Exception innerexception in ex.innerexceptions) Console.WriteLine(ex.Message); } OE-NIK HP 10

Task hibakezelés Másik megoldás feltételes continuation segítségével: Task taskwithcontinuation = new Task(LongOperationWithException); taskwithcontinuation.continuewith((t) => Console.WriteLine("THERE WAS AN EXCEPTION: 0}", t.exception.message); }, TaskContinuationOptions.OnlyOnFaulted); taskwithcontinuation.start(); OE-NIK 11

Feladat: könyvtár méretének megállapítása Állapítsuk meg egy könyvtárban és alkönyvtáraiban található fájlok méreteinek összegét! Esetleg kivétel keletkezhet könyvtár elérésekor Az alkönyvtárak kigyűjtésére esetleg dedikált Task ügyelhet Emlékeztetőül: using System.IO; //... DirectoryInfo di = new DirectoryInfo(path); foreach (FileInfo fi in di.getfiles()) bytes += fi.length; //... Directory.GetDirectories(path) OE-NIK HP 12

Task leállítása (canceling) A Task-ban végzett műveletben kell kezelni a leállítás lehetőségét Ún. CancellationTokenen keresztül történik a Task értesítése Használható ellenőrzési módok: cancellationtoken.iscancellationrequested: bool tulajdonság. Ha igaz, ki kell lépni a függvényből cancellationtoken.throwifcancellationrequested(): Exception keletkezik, ha leállítás volt kérelmezve (ezzel kilép a függvényből) Előny: az Exception egyértelműen mutatja, hogy a leállás nem a művelet vége miatt történt static void CancellableLongOperation(CancellationToken cancellationtoken) } for (int i = 0; i < 100; i++) } cancellationtoken.throwifcancellationrequested(); Thread.Sleep(100); OE-NIK 13

Task leállítása (canceling) CancellationTokenSource source = new CancellationTokenSource(); Task taskwithcancel = Task.Run(() => CancellableLongOperation(source.Token), source.token); source.cancel(); try taskwithcancel.wait(); } catch (AggregateException ex) ex.handle(e => e is OperationCanceledException); Console.WriteLine("A műveletet leállították."); } ex.handle lekezeltnek nyilvánítja az AggregateExceptionben található kivételeket, ha azok megfelelnek a megadott feltételnek Amennyiben maradt még kezeletlen kivétel, új kivételdobás történik Ha nem maradt kezeletlen kivétel, nincs dobás, lefut az utolsó sor is CancellationToken.None adható át, ha le akarjuk tiltani a leállítást OE-NIK 14

GUI-elem kezelése Windows-os grafikusfelület-elemekhez általában nem lehet hozzányúlni, csak a létrehozó szálról (GUI szál) Még közvetve sem WPF, Windows Forms is! Van kevés kivétel (bizonyos függvények, adatkötésnél a PropertyChanged) Általános megoldás: Invoke Függvény végrehajtatása a GUI szállal Dispatcher.Invoke(() => }); label.content =...; listbox.items.add(...); OE-NIK 15

GUI-elem kezelése Rövidebb módszer, ha a Task eredményét kiíró műveletet is külön Taskként indítjuk, megadott taskütemező (TaskScheduler) segítségével Beépített taskütemezők: Thread Pool Task Scheduler: a ThreadPool-on indítja a taskokat (alapértelmezett) Synchronization Context Task Scheduler: a felhasználói felület szálján indítja a taskokat ezzel kell indítani, ha GUI-elemet akarunk kezelni Referencia megszerzése : a GUI szálján TaskScheduler.FromCurrentSynchronizationContext() Task<int> taskwithreturnvalue = Task.Run(() => Thread.Sleep(1000); return 6; }); taskwithreturnvalue.continuewith( t => textbox1.text = "Result: " + t.result, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext()); OE-NIK HP 16

Feladat: könyvtárak méretének megállapítása Vizuális alkalmazásban legyen lehetőség könyvtárakat kiválasztani, melyek mérete megállapításra kerül! A vizuális elemek működjenek a háttérben futó Task mellett is! A számítás megszakítható legyen! OE-NIK HP 17