c# - vícevláknové aplikace

13
Vícevláknové aplikace INPTP 2016

Upload: jan-hridel

Post on 19-Feb-2017

39 views

Category:

Education


0 download

TRANSCRIPT

Page 1: C# - Vícevláknové aplikace

Vícevláknové aplikaceINPTP 2016

Page 2: C# - Vícevláknové aplikace

Aplikace s více podprocesy▪ Nejspolehlivější způsob vytvoření aplikace s více podprocesy je použít

komponentu BackgroundWorker (viz dále).▪ Pro větší kontrolu nad chováním podprocesů a aplikace, můžeme podprocesy

spravovat sami.▪ Třída Thread

Page 3: C# - Vícevláknové aplikace

Třída Thread▪ Vytvoření nového podprocesu deklarováním proměnné typu Thread voláním

konstruktoru s názvem metody, která se má provést na novém podprocesu.▪ System.Threading.Thread newThread = new System.Threading.Thread(AMethod);

Page 4: C# - Vícevláknové aplikace

Třída Thread▪ Spuštění a ukončení podprocesů

▪ newThread.Start(); //spuštění▪ newThread.Abort(); //zastavení

Page 6: C# - Vícevláknové aplikace

Třída Thread▪ Vlastnosti podprocesuProperty Value

IsAlive Obsahuje hodnotu True pokud je podproces aktivní.

IsBackgroundZíská nebo nastaví logickou hodnotu označující, pokud podproces je nebo by měl být podprocesem na pozadí.

NameZíská nebo nastaví název podprocesu. Nejčastěji používané při ladění ke zjištění jednotlivých podprocesů.

PriorityZíská nebo nastaví hodnotu, která se používá ke stanovení priorit plánování podprocesů operačního systému.

ApartmentStateZíská nebo nastaví model podprocesu používaný pro konkrétní vlákno. Modely podprocesů jsou důležité při volání podprocesu nespravovaný kód.

ThreadState Obsahuje hodnotu, která popisuje stav nebo stavy podprocesu.

Page 7: C# - Vícevláknové aplikace

Třída ThreadPool▪ Vytvoření a rušení podprocesu pomocí třídy Thread je časově náročné. Proto

modul CLR nabízí fond již vytvořených pracovních podprocesů k okamžitému použití. Tento fond je přístupný prostřednictvím třídy ThreadPool.

▪ Po ukončení pracovního podprocesu se tento podproces vrátí zpět do fondu k opakovanému použití. Pokud je fond podprocesů vyčerpaný, operace požadující své spuštění, je zařazena do fronty a čeká, dokud se některý podproces nevrátí zpět do fondu.

Page 8: C# - Vícevláknové aplikace

Třída ThreadPool▪ Třída ThreadPool je statická třída. Spuštění podprocesu provádí metoda

QueueUserWorkItem:▪ bool QueueUserWorkItem(WaitCallback callBack)▪ bool QueueUserWorkItem(WaitCallback callBack, object state)

Page 9: C# - Vícevláknové aplikace

Třída ThreadPool▪ Příklad:

▪ Naplnění sdíleného seznamu prvočísel je provedeno ve dvou podprocesech z fondu podprocesů. Pokud by nebyl uveden příkaz #1, který čeká na dokončení pracovních podprocesů, program by po stisknutí libovolné klávesy okamžitě skončil a výpis prvočísel by se neprovedl.

▪ Kódy: https://goo.gl/eU9jVE

Page 10: C# - Vícevláknové aplikace

Třída ThreadPool▪ Maximální a minimální počet podprocesů

▪ Pro každý proces je k dispozici samostatný fond podprocesů. Počet operací, které čekají ve frontě na uvolnění podprocesu z fondu, není omezen, resp. je limitován pouze operační pamětí počítače. Fond podprocesů limituje počet současně aktivních (běžících) podprocesů. Od verze .NET 4.0 implicitní maximální velikost fondu podprocesů závisí na několika faktorech, např. velikosti virtuálního adresového prostoru. Tuto velikost je možné zjistit nebo nastavit voláním metod:▪ void GetMaxThreads(out int workerThreads, out int completionPortThreads)

▪ bool SetMaxThreads(int workerThreads, int completionPortThreads)

▪ Kódy: https://goo.gl/jwihA2

Page 11: C# - Vícevláknové aplikace

Asynchronní delegáty▪ Delegát resp. metodu, na kterou se delegát odkazuje (dále jen cílová metoda), lze

volat dvěma způsoby:▪ synchronně – v aktuálním podprocesu,▪ asynchronně – v novém podprocesu.

▪ Synchronní volání provádí metoda Invoke, která se použije při standardním volání delegátu.

▪ Asynchronní volání provádí metoda BeginInvoke. Cílová metoda se zavolá v podprocesu získaného z fondu podprocesů třídy ThreadPool. Podproces, který zavolal metodu BeginInvoke, je po jejím volání uvolněn a pokračuje ve vykonávání dalších příkazů paralelně s prováděním příkazů cílové metody.

Page 12: C# - Vícevláknové aplikace

Třída BackgroundWorker▪ Třída BackgroundWorker reprezentuje jednoduchou implementaci návrhového

vzoru EAP.▪ Slouží k provedení jedné asynchronní operace současně. Poskytuje události

informující o průběhu a ukončení operace. Tyto události mohou být využity v uživatelském rozhraní aplikace.

▪ Je deklarována v prostoru jmen System.ComponentModel a je odvozena od třídy Component, což znamená, že ji lze použít jako nevizuální komponentu v návrhovém zobrazení formuláře. Třída Component implementuje rozhraní IDisposable, které však tato třída nevyužívá. Pokud se např. zavolá metoda Dispose před voláním metody, která spouští asynchronní operaci, žádná výjimka při spuštění asynchronní operace nevznikne a asynchronní operace řádně proběhne.

Page 13: C# - Vícevláknové aplikace

Třída BackgroundWorker▪ Asynchronní operaci provádí v podprocesu získaném z fondu podprocesů třídy ThreadPool.

▪ Události posílá v podprocesu, který je vhodný pro příjemce události. Pokud je příjemcem události formulář, událost posílá v hlavním podprocesu aplikace, a tudíž se nemusí po přijmutí události volat metoda Invoke třídy Control.

▪ Neostřenou výjimku třída zachytí a poskytne ji v události informující o ukončení operace. Neošetřená výjimka tedy nezpůsobí ukončení aplikace.

▪ Více na:▪ http://csharp-video-tutorials.blogspot.cz/2014/03/backgroundworker-class-example-in.

html▪ https://www.youtube.com/watch?v=TwlO5XYeeMo