Reflexe (1) Reflexe (Reflection) představuje proces ve-doucí k získání informací o sestavách (assemblies) a datových typech, které jsou v nich definovány Umožňuje procházení a manipulaci s objek-tovým modelem reprezentujícím konkrétní aplikaci Každá aplikace pro .NET Framework je tvořena alespoň jednou sestavou (assembly) 22/11/2017
Reflexe (2) Sestava (assembly): tvoří základní (primární) stavební blok aplikace určené pro .NET Framework skládá se ze čtyřech prvků: manifest, který obsahuje metadata o sestavě metadata o typech uložených v assembly kód v jazyce CIL (MSIL) zdroje (resources) Metadata o obsažených typech a kód v jazyce CIL tvoří tzv. modul (module), který může obsahovat definice datových typů a jejich implementace 22/11/2017
Reflexe (3) Poznámka: Manifest obsahuje např.: sestava může obecně obsahovat více modulů jednotlivé moduly jsou reprezentovány soubory s příponou .netmodule Manifest obsahuje např.: jednoduchý název sestavy číslo verze sestavy seznam souborů, které tvoří danou sestavu seznam datových typů, které tvoří danou sestavu a informaci, ke kterému modulu v sestavě je kon-krétní typ připojen 22/11/2017
Reflexe (4) Každá aplikace pro .NET Framework běží v tzv. aplikační doméně (application domain): představuje izolované běhové prostředí obdoba procesu známého z Windows API není popsána metadaty je reprezentována třídou AppDomain (definová-na ve jmenném prostoru System) Třída AppDomain definuje mimo jiné: statickou vlastnost CurrentDomain: poskytuje přístup k aktuální aplikační doméně metodu GetAssemblies: vrací (v podobě pole) seznam zavedených sestav 22/11/2017
Reflexe (5) Pro využití možností reflexe jsou k dispozici následující třídy: Object Abstraktní třída Assembly AssemblyName MemberInfo FieldInfo Module PropertyInfo ParameterInfo MethodBase ConstructorInfo EventInfo MethodInfo Type 22/11/2017
Reflexe (6) Třída Assembly: Třída AssemblyName: zapouzdřuje sestavu, tj. samopopisující se blok aplikace CLR umožňuje: zavést sestavu zjistit metadata a součásti sestavy identifikovat datové typy, jež jsou v sestavě obsaženy vytvářet instance obsažených datových typů Třída AssemblyName: umožňuje zjistit informace o identitě sestavy např.: verze, informace o kultuře apod. 22/11/2017
Reflexe (7) Třída MemberInfo: představuje předka pro třídy, které poskytují informace o členech třídy, tj. o: datových položkách – FieldInfo vlastnostech – PropertyInfo událostech – EventInfo mezi potomky MemberInfo patří i třídy: MethodBase: předek pro třídy: ConstructorInfo: poskytuje informace o konstruktorech MethodInfo: poskytuje informace o metodách Type: reprezentuje deklarace datových typů (tříd, rozhraní, polí, hodnotových typů, výčtových typů, generik apod.) představuje metadata typů 22/11/2017
Reflexe (8) Třída Module: Třída ParameterInfo: Poznámka: provádí reflexi modulu zpřístupňuje modul v rámci sestavy Třída ParameterInfo: poskytuje informace o atributech parametrů např.: datové typy, implicitní hodnoty Poznámka: všechny výše uvedené třídy (vyjma třídy Type) jsou definovány ve jmenném prostoru System.Reflection 22/11/2017
Třída Type (1) Definována ve jmenném prostoru System Poskytuje členy pro zpřístupnění metadat daného datového typu Abstraktní třída její instanci nelze vytvořit voláním konstruktoru Pro získání instance lze použít: volání metody GetType zděděné od třídy Object na konkrétní instanci třídy např.: Person p = new Person(); Type t = p.GetType(); 22/11/2017
Třída Type (2) volání statické metody GetType třídy Type např.: Person p = new Person(); Type t = Type.GetType (”Namespace.Person”); operátor typeof: např.: Person p = new Person(); Type t = typeof(Person); 22/11/2017
Třída Type (3) Mezi členy poskytované třídou Type patří např.: vlastnosti pro zjištění základních charakteristik (rysů) daného datového typu, např.: IsAbstract, IsArray, IsClass, IsEnum, IsGenericTypeDefinition, IsGenericParameter, IsInterface, IsPrimitive, IsSealed, IsValueType metody vracející pole obsahující požadované položky, např.: GetConstructors, GetEvents, GetFields, GetInterfaces, GetMembers, GetMethods, GetNestedTypes, GetProperties 22/11/2017
Dynamické vytvoření instance (1) Na základě informací získaných pomocí re-flexe je možné dynamicky vytvořit instanci třídy, která je definována v jiné sestavě Pro dynamické vytvoření instance lze využít statickou metodu CreateInstance třídy Activator Metoda CreateInstance: umožňuje zadat parametry předávané konstrukto-ru (v podobě pole s prvky typu object) vrací odkaz na nově vytvořený objekt (vrácená hodnota je typu object) 22/11/2017
Dynamické vytvoření instance (2) U dynamicky vytvořené instance lze např.: zpřístupnit vlastnosti, k čemuž je možné použít: metodu GetProperty třídy Type: vrací hodnotu typu PropertyInfo metodu GetValue, resp. SetValue třídy PropertyInfo: umožňuje přečíst, resp. zapsat hodnotu zadané vlastnosti vyvolat metodu pomocí: metody GetMethod třídy Type: vrací hodnotu typu MethodInfo metody Invoke třídy MethodInfo: provede vyvolání zadané metody parametry jsou předávány jako pole s prvky typu object vrácená hodnota je typu object 22/11/2017
Regulární výrazy Regulární výraz (regular expression, regex) je řetězec popisující množinu řetězců Představuje vzor (šablonu), který je porovná-ván se vstupním textem Nejčastěji používány při vyhledávání textu nebo manipulaci s textem Regulární výraz se skládá z: literálů textu, které se mají shodovat speciálních znaků (metaznaků), které nejsou sou-částí hledaného textu, ale slouží pro popis alter-nativ, množin, počtů výskytů přepínačů 22/11/2017
Syntaxe regulárních výrazů (1) Tečka, zpětné lomítko . odpovídá libovolnému znaku k.s – kus, kos, k2s atd. \ vrací metaznaku původní význam a\+b – a+b Kvantifikátory – předcházející znak se musí vyskytovat … ? minimálně 0x, maximálně 1x ku?s – ks, kus * minimálně 0x, maximálně bez omezení halo* – hal, halo, halooo + minimálně 1x, maximálně bez omezení halo+ – halo, halooo {n} právě n-krát 10{6} – 1000000 {m,n} minimálně m-krát, maximálně n-krát 10{2,3} – 100, 1000 {n,} minimálně n-krát 10{2,} – 100, 1000, 10000 22/11/2017
Syntaxe regulárních výrazů (2) Skupiny znaků – odpovídá [] jednomu znaku v závorkách [abc] – a, b, c [^] jednomu znaku, neuvedenému v závorkách [^abc] – libovolný znak kromě a, b, c [-] jednomu znaku z rozsahu znaků [a-z] – malá písmena abecedy \s bílému znaku (\n, \r, \t, mezera aj.) a\sb – a b, ale ne ab \S jinému než bílému znaku a\Sb – a+b, ale ne a b \d desítkové číslici a\db – a2b, ale ne axb \D libovolnému znaku kromě desít. číslice a\Db – axb, ale ne a2b \w alfanumerickému znaku a podtržítku \w – 1, a, A, _, ale ne $, + \W nealfanum. znaku nebo podtržítku \W – $, !, ?, %, ale ne 2, b 22/11/2017
Syntaxe regulárních výrazů (3) Hranice (ukotvení) – odpovídá pozici … ^ za začátku řetězce čí řádku ^Petr – najde Petr na začátku řetězce nebo řádku $ na konci řetězce či řádku Pavel$ – najde Pavel na konci řetězce nebo řádku \b na začátku či konci slova \bkos\b – nenajde kos ve slově kost či kokos \B kdekoliv kromě začátku a konce slova \Bkos – najde kos ve slově kokos, ale ne v kost 22/11/2017
Syntaxe regulárních výrazů (4) Alternativy, seskupování, zpětné odkazy (reference) | odděluje několik dílčích výrazů ahoj|nazdar – odpovídá právě jednomu z pozdravů odděluje několik dílčích subvýrazů a{b|c} – odpovídá právě ab a ac () subřetězec, na nějž lze aplikovat kvantifikátor ko(ko)?s – odpovídá právě kos a kokos subřetězec, na nějž se lze odkazovat (\d)\1, resp. (\d)$1 – odpovídá 11, 22, 33 22/11/2017
Příklady regulárních výrazů Regulární výraz Odpovídá a+ sekvence písmen a (1 a více znaků) a* sekvence písmen a (0 a více znaků) o?kov okov nebo kov tel(efon)? tel nebo telefon telef(on|ax)? telefon nebo telefax [0-9]|[1-9][0-9] čísla 0 – 99 \d{2} sekvence dvou číslic desítkové soustavy (00, 01 – 98, 99) (19|20)\d{2} letopočty 1900 – 2099 \d{2,6} sekvence dvou až šesti číslic [^ ,.]+ neprázdná sekvence znaků, mezi nimiž nesmí být mezera, čárka nebo tečka \d+0$ řetězec, který končí znakem 0, kterému předchází minimálně jedna číslice 22/11/2017
Třída Regex (1) Definována ve jmenném prostoru System.Text.RegularExpressions Reprezentuje neměnný (immutable) regulární výraz Lze ji využít např. k: rozboru textu (parsing) vyhledávání specifických vzorů textu editování, nahrazování nebo mazání textových podřetězců 22/11/2017
Třída Regex (2) Regulární výraz, s nímž chceme pracovat je specifikován v době volání konstruktoru Metody provádějící testování, zda text odpo-vídá regulárnímu výrazu jsou definovány jako instanční i jako statické Mezi nejčastěji používané metody patří: IsMatch: testuje, zda specifikovaný regulární výraz odpovídá zadanému řetězci vrací hodnotu typu bool 22/11/2017
Třída Regex (3) Match: Matches: hledá v zadaném řetězci první výskyt textu, který odpovídá specifikovanému regulárnímu výrazu vrací hodnotu typu Match, pomocí jejíž: vlastnosti Success lze ověřit, zda odpovídající text byl, resp. nebyl nalezen vlastnosti Value je možné získat nalezený text metody NextMatch lze hledat další výskyt textu (jež odpo-vídá specifikovanému regulárnímu výrazu) Matches: hledá v zadaném řetězci všechny výskyty textu, které odpovídají specifikovanému regulárnímu výrazu vrací hodnotu typu MatchCollection 22/11/2017
Třída Regex (4) Replace: Split: provede náhradu všech výskytů textu (specifikova-ných regulárním výrazem) zadaným řetězcem vrací hodnotu typu string Split: rozdělí vstupní řetězec na pozicích definovaných regulárním výrazem vrací pole řetězců 22/11/2017
Multitasking Schopnost operačního systému mít spuštěno více programů současně Operační systém používá hardwarové hodiny a každému běžícímu procesu přiděluje tzv. časová kvanta Pokud jsou časová kvanta dostatečně malá (a počítač není přetížen velkým množstvím spuštěných programů), má uživatel pocit, že všechny programy pracují současně 22/11/2017
Multithreading (1) Schopnost programu (za příslušné podpory operačního systému) zavést „multitasking sám v sobě“ Program se může rozdělit na několik samo-statných výpočtových (prováděcích) vláken, tzv. threads Jednotlivým vláknům jsou pak opět přidělová-na časová kvanta a tím vzniká dojem, že tato vlákna pracují současně 22/11/2017
Multithreading (2) Dovoluje vyvolat funkci programu, ještě dří-ve než byla dokončena funkce předešlá Program (v operačním systému podporujícím multithreading) začíná pracovat hlavním (primárním) výpočtovým vláknem V rámci hlavního výpočtového vlákna mohou být vytvářena a spouštěna další výpočtová vlákna 22/11/2017
Třída Thread (1) Definována ve jmenném prostoru: System.Threading Umožňuje vytváření a řízení činnosti výpoč-tových vláken Vytvoření nového výpočtového vlákna lze provést prostřednictvím volání konstruktoru (třídy Thread) Volanému konstruktoru se jako parametr pře-dá delegát specifikující metodu, která obsa-huje příkazy, jež se budou v průběhu výpoč-tového vlákna provádět 22/11/2017
Třída Thread (2) Delegát specifikující vyvolávanou metodu je tvaru: public delegate void ThreadStart() public delegate void ParameterizedThreadStart(object obj) Zahájení činnosti výpočtového vlákna je mož-né následně provést pomocí volání metody Start: vlákno je spuštěno asynchronně, tj. jako nebloku-jící Vlastnosti: CurrentThread: vrací aktuálně běžící výpočtové vlákno 22/11/2017
Třída Thread (3) IsBackground: Name: Priority: udává, zda se jedná o výpočtové vlákno, které je na pozadí, tj. background výpočtové vlákno může být background (nezabraňuje ukončení procesu) nebo foreground v okamžiku, kdy jsou všechna výpočtová vlákna fore-ground (patřící k danému procesu) ukončena, dojde k ukončení celého procesu a všechna zbývající vlákna background zůstanou nedokončena Name: specifikuje jméno výpočtového vlákna Priority: udává prioritu vlákna (Lowest, BelowNormal, Normal, AboveNormal, Highest) 22/11/2017
Třída Thread (4) Metody: ThreadState: Abort: Join: specifikuje stav vlákna (např. Running, Stopped, Aborted, Background apod.) Metody: Abort: způsobí výjimku ThreadAbortException a za-hájí proces vedoucí k ukončení výpočtového vlákna výjimka ThreadAbortException může být za-chycena, ale na konci bloku catch je vyvolána znovu opětovnému vyvolání ThreadAbortException lze zabránit voláním metody ResetAbort Join: blokuje volající výpočtové vlákno, dokud dané výpoč-tové vlákno neskončí 22/11/2017
Třída Thread (5) ResetAbort: Sleep: Start: ruší požadavek na ukončení výpočtového vlákna Sleep: pozastaví provádění vlákna na specifikovaný počet milisekund Start: zahájí činnost dříve vytvořeného výpočtového vlákna dané vlákno se po vyvolání metody Start nachází ve stavu Running umožňuje předat objekt obsahující data, která mají být použita metodou spouštěnou v rámci výpočtového vlákna je-li vlákno dokončeno, nemůže být pomocí metody Start znovu restartováno 22/11/2017
Třída Thread (6) Poznámka: existují i metody Suspend a Resume pro do-časné pozastavení činnosti vlákna a pro opětovné pokračování v jeho činnosti tyto metody jsou však zastaralé (obsolete) a v bu-doucích verzích nebudou podporovány 22/11/2017
Příkaz lock (1) Označuje blok programu jako kritickou sekci Slouží k zabezpečení, že určitý blok programu proběhne bez přerušení jinými výpočtovými vlákny Příklad: private static object theLock = new object(); … public static void DoWork() { lock (theLock) { // kritická sekce } } 22/11/2017
Příkaz lock (2) Zaručuje, že výpočtové vlákno nevstoupí do kritické sekce v době, kdy se v ní nachází jiné výpočtové vlákno Objekt uvedený jako argument za klíčovým slovem lock: je použitý pro identifikaci zdrojů sdílených mezi více výpočtovými vlákny musí být viditelný všemi vlákny musí být referenčního datového typu by měl být chráněný proti vnějšímu přepsání (private) 22/11/2017
Příkaz lock (3) Příkaz lock představuje syntaktickou zkratku pro volání metod Enter a Exit statické třídy Monitor s použitím bloku try a finally Příklad: private static object theLock = new object(); … public static void DoWork() { Monitor.Enter(theLock); try { // kritická sekce } finally { Monitor.Exit(theLock); } } 22/11/2017
Třída ThreadPool (1) Definována ve jmenném prostoru System.Threading Statická třída, která poskytuje fond (sadu) vý-počtových vláken (řízených CLR), která je možné využít k provádění kódu (úloh) Vhodná zejména pro větší množství kratších úloh Všechna výpočtová vlákna prováděná v rám-ci třídy ThreadPool: se chovají jako vlákna background mají prioritu Normal 22/11/2017
Třída ThreadPool (2) Jestliže vlákno dokončí svou úlohu, je vráce-no do fondu vláken a může být opětovně po-užito: minimalizuje režii při vytváření nových vláken pro každou úlohu Jsou-li všechna vlákna zaměstnána, pak jsou další úlohy vkládány do fronty, dokud se ne-uvolní vlákna pro jejich zpracování Metody: GetMaxThreads: vrací maximální počet požadavků, které mohou být současně aktivní 22/11/2017
Třída ThreadPool (3) GetAvailableThreads: SetMaxThreads: vrací rozdíl mezi maximálním počtem vláken (hodno-tou vrácenou metodou GetMaxThreads) a počtem aktuálně aktivních vláken SetMaxThreads: nastavuje maximální počet požadavků, které mohou být současně aktivní QueueUserWorkItem: zařazuje metodu, která má být provedena vláknem, do fronty metoda začne být prováděna v okamžiku, kdy je ve fondu vláken dostupné (volné) vlákno signatura metody musí odpovídat delegátu: public delegate void WaitCallback(object state) 22/11/2017
Třída ThreadPool (4) RegisterWaitForSingleObject: registruje tzv. wait handle společně s metodou, která se zavolá v okamžiku, kdy dojde k signalizaci wait handlu signatura registrované metody musí odpovídat delagá-tu: public delegate void WaitOrTimerCallback(object state, bool timedOut) wait handle lze implementovat pomocí potomků třídy WaitHandle (vyjma třídy Mutex), např. pomocí třídy ManualResetEvent Pro zjištění, zda vlákno ukončilo svoji čin-nost, je zapotřebí odeslat signál (např. pomo-cí wait handle) 22/11/2017
Task Parallel Library Task Parallel Library (TPL) představuje mno-žinu tříd definovanou ve jmenném prostoru System.Threading.Tasks a částečně i ve jmenném prostoru System.Threading Umožňuje efektivní zpracování úloh s využi-tím všech dostupných jader procesoru Provádí např. řízení vláken ve fondu vláken (ThreadPool) a další nízkoúrovňové operace Podobně jako u třídy ThreadPool: mohou být vlákna opětovně použita vlákna pracují na pozadí 22/11/2017
Třída Parallel (1) Třída TPL definovaná ve jmenném prostoru System.Threading.Tasks Automaticky používá vlákna z fondu vláken a řídí konkurenční přístup Obsahuje (přetěžované) statické metody For a ForEach, které umožňují iterovat kolek-cemi implementujícími rozhraní IEnumerable<T> Tyto metody: umožňují zadat část kódu, která má být zpracová-na paralelně blokují provádění hlavního vlákna 22/11/2017
Třída Parallel (2) Přináší podporu datového paralelismu: stejné operace jsou prováděny současně nad prv-ky v kolekci (poli) vstupní kolekce (pole) je rozdělena tak, aby více vláken mohlo současně pracovat nad jejími růz-nými částmi Srovnání (foreach): sekvenční verze: foreach (var item in sCollection) { DoWork(item); } paralelní ekvivalent: Parallel.ForEach(sCollection, item => DoWork(item)); 22/11/2017
Třída Parallel (3) Příklad (možná použití metody For): static void TestMethod() { Parallel.For(0, 1000, DoWork); Parallel.For(0, 1000, delegate(int i) { // Provedení práce }); Parallel.For(0, 1000, i => { // Provedení práce }); } static void DoWork(int i) { // Provedení práce } 22/11/2017
Třída Task Definována ve jmenném prostoru System.Threading.Tasks Reprezentuje asynchronní operace Metoda, která má být provedena jako samo-statná úloha (task), může být specifikována (jako parametr) v době volání konstruktoru Její následné spuštění lze realizovat voláním metody Start Prováděná metoda neblokuje hlavní vlákno aplikace Na její dokončení počkat pomocí metody Wait 22/11/2017