Eseményvezérelt alkalmazások fejlesztése II 9. előadás. Window Runtime alapismeretek, Modern UI alapú alkalmazások

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Window Runtime alapismeretek. Windows Runtime alapismeretek A Windows Runtime

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Window Runtime alapismeretek, Modern UI alapú alkalmazások.

Eseményvezérelt alkalmazások fejlesztése II 8. előadás. Összetett WPF alkalmazások. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Xamarin alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

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

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

Eseményvezérelt alkalmazások fejlesztése II 9. előadás. WPF erőforrások kezelése. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

2. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Xamarin alapismeretek. Xamarin alapismeretek. Xamarin alapismeretek. Xamarin alapismeretek

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

Eseményvezérelt alkalmazások fejlesztése II 11. előadás. Window Runtime specifikus alkalmazások megvalósítása. Giachetta Roberto

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

2. Beadandó feladat dokumentáció

Ugráló gomb oktatási segédlet Ugráló gomb

3. Beadandó feladat dokumentáció

2. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése II 7. előadás. WPF alkalmazások architektúrája. Giachetta Roberto

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Programozási technológia

2. Beadandó feladat dokumentáció

Bánsághi Anna 2015 Bánsághi Anna 1 of 31

Tartalomjegyzék. Előszó... 10

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

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

Java Programozás 11. Ea: MVC modell

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

Concurrency in Swing

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

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése II 7. előadás. WPF alkalmazások architektúrája. WPF alkalmazások architektúrája

Image Processor BarCode Service. Felhasználói és üzemeltetői kézikönyv

Web-fejlesztés NGM_IN002_1

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

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

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

A szerzõrõl... xi Bevezetés... xiii

Eseményvezérelt alkalmazások

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

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

Grafikus felhasználói felület (GUI) létrehozása A GUI jelentése Egy egyszerű GUI mintaalkalmazás létrehozása

iphone és Android két jó barát...

Konkurens TCP Szerver

Eseményvezérelt és objektumorientált programozás

Programozási technológia

Vizuális programozás gyakorlat

components : IContainer dx : int dy : int tmidőzítő : Timer toolstripseparator1 : ToolStripSeparator tsmikilépés : ToolStripMenuItem

BME MOGI Gépészeti informatika 7.

1. Beadandó feladat dokumentáció

Swing GUI készítése NetBeans IDE segítségével

libgdx alapok, első alkalmazás

Mobil Informatikai Rendszerek

Mobil készülékek programozása

Szoftver labor III. Tematika. Gyakorlatok. Dr. Csébfalvi Balázs

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

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Webes alkalmazások fejlesztése. Bevezetés az ASP.NET MVC 5 keretrendszerbe

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Programozási nyelvek JAVA EA+GY 1. gyakolat

Szoftvertechnológia alapjai Java előadások

Java I. A Java programozási nyelv

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Java programozási nyelv 6. rész Java a gyakorlatban

C#, OOP. Osztályok tervezése C#-ban

VII. Appletek, grafika

Vizuális, eseményvezérelt programozás XI.

Thermo1 Graph. Felhasználói segédlet

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

Programozási környezetek

BME MOGI Gépészeti informatika 6.

Win 8 változatok. 2. sz. melléklet felnottkepzes@gmail.com. Töltse ki az előzetes tudásszint felmérő dolgozatot!

Operációs rendszerek. Az X Window rendszer

3. Beadandó feladat dokumentáció

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

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

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

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

Autóipari beágyazott rendszerek. Komponens és rendszer integráció

Tartalomjegyzék. Előszó... xiii Bevezetés... xv. 1. Ismerkedés a Windows 7-tel Integráció a Windows 7 tálcájával: az alapszolgáltatások...

Nokia N9 - MeeGo Harmattan bemutatkozik

Eseménykezelés. Aszinkron kommunikáció

BME MOGI Gépészeti informatika 13.

Mobil Informatikai Rendszerek

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

PHP-MySQL. Adatbázisok gyakorlat

Alap számológép alkalmazás

OOP #14 (referencia-elv)

A GeoEasy telepítése. Tartalomjegyzék. Hardver, szoftver igények. GeoEasy telepítése. GeoEasy V2.05+ Geodéziai Feldolgozó Program

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

CAN alapú járműves adatokat megjelenítő szoftver fejlesztése

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

A GeoEasy telepítése. Tartalomjegyzék. Hardver, szoftver igények. GeoEasy telepítése. GeoEasy V2.05 Geodéziai Feldolgozó Program

Szoftvertechnológia alapjai Java előadások

Operációs rendszerek. Az NT folyamatok kezelése

Segédanyag: Java alkalmazások gyakorlat

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

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése II 9. előadás Window Runtime alapismeretek, Modern UI alapú alkalmazások 2013.11.21. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Kialakulás A.NET keretrendszer felügyelt platformja több hátránnyal is rendelkezik (teljesítmény, együttműködés) sok esetben vegyes kódbázisú alkalmazásokat kell építeni ezért a cél a felügyelet mentes és felügyelt technológiák egységesítése, ugyanakkor alkalmassá tétele több programozási nyelvvel/technológiával való kompatibilitásra (C/C++,.NET, JavaScript) A Windows Runtime (WinRT) a Windows 8 rendszerek fejlesztői platformja egységes, felügyeletmentes API, amely különböző technológiákon (.NET, JavaScript) keresztül is elérhető ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:2

Architektúra XAML HTML5, CSS3 C/C++ C#/Visual Basic.NET 4.5 JavaScript JavaScript motor Windows Runtime Windows szolgáltatások ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:3

Koncepciók Koncepciók: technológiákkal való együttműködés, összehangolás, metaadat-kezelés hatékonyságnövelés, aszinkron végrehajtási modell biztonságos működés, korlátozott rendszerhozzáférés célhardverek kezelése, hozzáférés szabályozás Mobiltelefonokra szánt változata a Windows Phone Runtime Lehetőségünk van minden platformra (WinRT,.NET, Silverlight, XBox) közös komponenseket definiálni: Portable Class Library (PCL) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:4

Alkalmazások mobil környezetben A mobil/táblagépes környezetben alkalmazásunknak számos olyan követelményt kell teljesíteni, amit az asztali alkalmazásnak nem fontos az adaptivitás: az alkalmazás különböző hardvereken, különböző méretű/felbontású képernyőkön, különböző tájolással (portré/tájkép), különböző üzemmódokban (teljes képernyő, oldalra zárt, ) futhat fontos a beviteli gesztusok kezelése elérhetőek speciális hardverek (GPS, gyorsulásmérő, ) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:5

Alkalmazások grafikus felülete Az alkalmazások grafikus felülete a Modern UI (korábban Metro UI) tervezési koncepció segítségével valósul meg infografikus, célja a minimalizmus, a letisztultság, a kezelhetőség növelése (kisebb méretű kijelzőkön is) az alkalmazás futtatása legyen gyors és folyamatos (aszinkron végrehajtás) egy meghatározott tervezési vonalat, és annak sajátosságait (pl. Segoe UI betűstílus) kell követni nélkülözi a bonyolult grafikákat, animációkat az ikonokat felváltja csempékkel, amelyek tartalma dinamikus is lehet ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:6

Alkalmazások futtatása Az alkalmazások egy biztonságos környezetben futnak nem férhetnek hozzá más alkalmazások adataihoz csak korlátozott módon férhetnek hozzá a rendszer adataihoz (pl. fájlrendszer), és azt is csak engedéllyel szintén engedéllyel használhatják csak az eszközöket emiatt a fejlesztői eszközkészletük is korlátozott Az alkalmazás tulajdonságait, illetve engedélyeit az alkalmazás azonosító (Application Manifest), amely része az alkalmazás csomagjának az engedélyeket a telepítéskor jóvá kell hagyni ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:7

Alkalmazások életciklusa A mobil alkalmazások más életciklusban futnak, mint az asztali alkalmazások a futás és a terminált állapotok mellett megjelenik a felfüggesztett állapot is, amely akkor lép életbe, ha az alkalmazás a háttérbe (vagy a gép alvó állapotba) kerül aktiválás leállítva futás alatt folytatás felfüggesztés felfüggesztve leállítás ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:8

Alkalmazások életciklusa a felfüggesztés célja az erőforrásokkal való takarékosság a terminálás gesztussal történik (más módot ne adjunk rá), de a felhasználó mellett az operációs rendszer automatikusan is bezárhatja az alkalmazást amennyiben kevés az erőforrás (memória) erről az alkalmazás nem kap figyelmezetést, ezért célszerű felfüggesztéskor menteni az adatokat, illetve elengedni az erőforrásokat a program elszállhat kivétellel, ekkor eltűnik, és a felhasználó visszakerül a Start képernyőre ekkor ne állítsuk vissza a mentett adatokat ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:9

Alkalmazások felépítése Az alkalmazásaink (projektjeink) állnak: szabványos kódfájlokból, illetve grafikus felületből (XAML és háttérkód) erőforrás gyűjteményekből (Resource Dictionary), illetve más erőforrásokból (pl. csempe és nyitó képernyő grafikák) személyes azonosító fájlból (Personal Information Exchange file) alkalmazás azonosítóból (Application Manifest) Az alkalmazás (és a hozzá tartozó tartalom) egy csomagot alkot (appx), amely publikálható a Windows Áruházban, amennyiben megfelel az elvárásoknak ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:10

Alkalmazások architektúrája A szoftvereket.net for Windows Store keretrendszerben fejlesztjük, amely a WinRT felügyelt interfésze, illetve egy lehatárolt részhalmaza a.net keretrendszernek az osztályok elsősorban a Silverlight programozási modelljére támaszkodnak Az alkalmazásokat fejleszthetjük: modell/nézet (MV) architektúrában az eszközkészlet jó része elérhető, az eseménykezelés a megszokott módon (kiegészülve pl. gesztúrákkal) modell/nézet/nézetmodell (MVVM) architektúrában több megszorítás található az eszközkészletre ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:11

A grafikus felület felépítése A grafikus felület oldalakból (Page) áll, amely kitölti a rendelkezésére álló teret a mérete előre nem meghatározható, ezért elrendezéseket (Grid, Canvas, StackPanel, ), transzformációkat (Viewbox) kell alkalmazni az oldal figyelhet az elhelyezésre is (LayoutAwarePage) az oldalakat keretbe helyezzük (Frame), amely szabályozza az oldalak közötti átmenetet (Navigate( )) lehet előugró üzenetek (MessageDialog) használni A programot az alkalmazás (App) vezérli, amely egyesíti az erőforrásokat ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:12

Példa Feladat: Készítsünk egy egyszerű számológépet, amellyel a négy alapműveletet végezhetjük el, illetve láthatjuk korábbi műveleteinket is. az alkalmazást modell/nézet architektúrában valósítjuk meg, a korábbi változatok alapján a korábban használt modell (CalculatorModel) megfelelő, így teljes egészében felhasználható lesz a képernyőn (CalculatorPage) felvesszük a megfelelő vezérlőket, eseménykezelővel végrehajtjuk a tevékenységeket, előugró dialógussal (MessageDialog) figyelmeztetünk a hibás bemenetre ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:13

Példa Tervezés: class Calculator App Application {leaf} EventArgs Model::CalculatorEventArgs + App() # OnLaunched(LaunchActivatedEventArgs) :void - App_Suspending(object, SuspendingEventArgs) :void Model::CalculatorModel -_model - _model :CalculatorModel View::CalculatorPage Page {leaf} -_operation «enumeration» Model::Operation + CalculatorPage() # OnNavigatedTo(NavigationEventArgs) :void - Model_CalculationPerformed(object, CalculatorEventArgs) :void - Button_Click(object, RoutedEventArgs) :void - PerformCalculation(Operation) :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:14

Példa Megvalósítás (CalculatorPage.xaml.cs): protected override void OnNavigatedTo( NavigationEventArgs e){ // akkor példányosítunk mindent, amikor az // oldalra navigáltak _model = new CalculatorModel(); _model.calculationperformed += // modell eseményének társítása _textnumber.text = _model.result.tostring(); } _textnumber.focus(focusstate.keyboard); _textnumber.selectall(); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:15

Példa Feladat: Javítsunk a számológép működésén úgy, hogy táblagépes környezetben is könnyen használható legyen. a felületen gombokat helyezünk el a bevitelhez (számok, tizedespont és törlés), így nem kell billentyűzetet használnunk az alkalmazást MVVM architektúrában építjük fel, a modellt (CalculatorModel) és a nézetmodellt (CalculatorViewModel) újra felhasználjuk a modellt kiegészítjük a törlés funkciójával, a nézetmodellt kiegészítjük az új gombok tevékenységeivel, valamint az üzeneteket nem elugró ablakban jelenítjük meg, hanem továbbítjuk a vezérlés (App) felé ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:16

Példa Tervezés: class Calculator View::CalculatorPage Page {leaf} EventArgs ViewModel::ErrorMessageEventArgs - _message :String + CalculatorPage() # OnNavigatedTo(NavigationEventArgs) :void + ErrorMessageEventArgs(String) «property» + Message() :String App - _viewmodel :CalculatorViewModel Application {leaf} + App() # OnLaunched(LaunchActivatedEventArgs) :void - App_Suspending(object, SuspendingEventArgs) :void - ViewModel_ErrorOccured(object, ErrorMessageEventArgs) :void -_viewmodel - _model :CalculatorModel - _numberfieldvalue :String INotifyPropertyChanged ViewModel::CalculatorViewModel + CalculatorViewModel() - Model_CalculationPerformed(object, CalculatorEventArgs) :void - Calculate(String) :void - OnPropertyChanged(String) :void - OnErrorOccured(String) :void «property» + NumberFieldValue() :String + DecimalSeparator() :String + Calculations() :ObservableCollection<String> + CalculateCommand() :DelegateCommand «event» + PropertyChanged() :PropertyChangedEventHandler + ErrorOccured() :EventHandler<ErrorMessageEventArgs> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:17

Példa Megvalósítás (CalculatorViewModel.cs): private void Calculate(String operatorstring){ switch (operatorstring) { // művelet végrehajtása, amely most már // számjegy, tizedesjel és törlés is lehet case "C": // törlés _model.clear(); _numberfieldvalue = "0"; OnPropertyChanged("NumberFieldValue"); break; ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:18

Példa Megvalósítás (CalculatorViewModel.cs): default: if (_numberfieldvalue == "0" && operatorstring!= DecimalSeparator) // 0 esetén lecseréljük a tartalmat // (kivéve, ha tizedesjel jön), // egyébként hozzáírjuk _numberfieldvalue = operatorstring; else // minden más esetben csak hozzáírjuk _numberfieldvalue += operatorstring; OnPropertyChanged("NumberFieldValue"); break; ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:19

Példa Megvalósítás (App.xaml.cs): protected override void OnLaunched( LaunchActivatedEventArgs args) { _viewmodel.erroroccured += new EventHandler<ErrorMessageEventArgs>( ViewModel_ErrorOccured); private void ViewModel_ErrorOccured(object sender, ErrorMessageEventArgs e){ MessageDialog dialog = new MessageDialog(e.Message); dialog.showasync(); } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:20

Példa Feladat: Készítsünk egy dinamikus méretezhető táblát, amely véletlenszerű színre állítja a kattintott gombot, valamint a vele egy sorban és oszlopban lévőket. MVVM architektúrát használunk, és a korábbi megoldásból felhasználjuk a nézetmodellt (ColorGridViewModel, ColorField) a nézetet ellátjuk oldalcímmel, és betartjuk az elhelyezési konvenciókat, továbbá csúszkákat (Slider) használunk az értékbeállításhoz (amelyet külön címkén is megjelenítünk) a rácsot ItemsControl segítségével helyezzük el, amelyet WrapPanel segítségével jelenítünk meg ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:21

Példa Megvalósítás (App.xaml.cs): <ItemsControl ItemsSource="{Binding Fields}"> <!-- elemek gyűjtő vezérlője --> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <!-- az elemek egy rácsban fognak elhelyezkedni, amelyet sorfolytonosan töltünk fel --> <WrapGrid Orientation="Horizontal" MaximumRowsOrColumns="{Binding ColumnCount}" /> </ItemsPanelTemplate> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:22

Erőforrásfájlok Amennyiben több lap, vagy vezérlő számára biztosítani akarjuk ugyanazt a stílus-, és sablonkészletet, akkor használhatunk erőforrásfájlokat (Resource Dictionary) Page Page UserControl ResourceDictionary csak XAML erőforrásokat tartalmazó fájlok használatba vehetőek bármely lapon, vagy a teljes alkalmazásban (az App osztályon keresztül) Az alapvető stílusok a CommonStyles fájlban találhatóak ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 6:23

Erőforrásfájlok Pl.: erőforrásfájl (StyleDict.xaml): <ResourceDictionary > <Style x:key= > <!-- stíluselem --> </ResourceDictionary> felhasználása egy lapon (MainPage.xaml): <Page.Resources> <ResourceDictionary Source="styleDict.xaml" /> <!-- erőforrásfájl betöltése --> </Page.Resources> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 6:24

Szinkron és aszinkron programozás A tevékenységek végrehajtásának két megközelítése van: szinkron: a tevékenység kezdeményezője megvárja annak lefutását a hívó szál blokkolódik, amíg a tevékenység le nem fut ha sokáig tart a tevékenység, akkor az a program felületén is észrevehető aszinkron: a tevékenység kezdeményezője nem várja meg a lefutást, illetve az eredményt a tevékenység (metódus) külön szálon fut az eredményt később megkapjuk (pl. eseményen át) a hívó szál nem blokkolódik, folytathatja a végrehajtást ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:25

Aszinkron műveletek Az aszinkron tevékenységeket aszinkron metódusok keretében valósítjuk meg a metódust megjelöljük az async kulcsszóval, illetve nevében is jelezzük, hogy aszinkron (<név>async) a visszatérési értéke általában egy taszk (Task), amely elvégzi a párhuzamos végrehajtást pl.: public async Task<String> GetStringAsnyc(){ String mystring; // hosszabb tevékenység return mystring; // eredmény visszaadása } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:26

Aszinkron műveletek végrehajtása Amennyiben az aszinkron művelet eredményt ad (nem void), akkor lefutását meg kell várnunk erre az await utasítást használhatjuk, a hívó ekkor várakozik, amíg az aszinkron tevékenység le nem fut csak aszinkron műveletben használható, hogy a teljes műveletsorozat párhuzamosan fusson A.NET nyelvi könyvtárban több műveletnek adott szinkron/aszinkron megvalósítása is (pl. ReadLine(), ReadLineAsync()) a WinRT nyelvi könyvtárban viszont jórészt csak az aszinkron műveletek találhatóak meg ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:27

Aszinkron műveletek végrehajtása Pl.: private void DoStuff() { } public async void ProcessString() { Task<String> getstringtask = myobject.getstringasync(); // a tevékenység elindul párhuzamos szálon DoStuff(); // ezen a szálon tovább tevékenykedhetünk, // közben a másik művelet is fut String result = await getstringtask; // majd feldolgozzuk a kiszámított eredményt } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:28

Párhuzamos tevékenységek Amennyiben párhuzamosan végzünk tevékenységet, és nem aszinkron műveletet futtatunk (pl. modell szintű időzítő), ügyelnünk kell a szinkronizációra a szálbiztos végrehajtáshoz használnunk kell a Dispatcher.RunAsync(<tevékenység>) metódust pl. CoreApplication.MainView.CoreWindow.Dispatcher. RunAsync(CoreDispatcherPriority.Normal, // a végrehajtás prioritását is megadjuk () => { // a tevékenység lambda-kifejezése textbox.text = "Hello World!"; })) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:29

Időzítés A felület szintű időzítő adott (DispatcherTimer), azonban a modell szintű időzítés (System.Timers.Timer) nem került be az osztálykönyvtárba a funkcionalitása kiváltható a ThreadPoolTimer típussal lehet periodikus, vagy egyszeri nem esemény alapú, konstruktorparaméterben megadható a futtatandó művelet a felhasználásával lehet készíteni saját időzítőt pl. timer = ThreadPoolTimer.CreatePeriodicTimer( Timeout, TimeSpan.FromMinutes(1)); // a Timeout függvényt hívja meg percenként ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:30

Példa Feladat: Készítsünk egy vizsgatétel generáló alkalmazást, amely ügyel arra, hogy a vizsgázók közül ketten ne kapják ugyanazt a tételt. használjunk MVVM architektúrát, és a korábbi megvalósítást a modellt (ExamGeneratorModel) nem kell módosítanunk, de ki kell egészítenünk egy időzítő (Timer) típussal a nézetmodellben (ExamGeneratorViewModel) szinkronizáltan kell lekezelnünk az időzítő párhuzamos eseményeit a nézet két lapot is tartalmaz (MainPage, SettingsPage), amelyek között navigálunk ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:31

Példa Tervezés: class ExamGenerator Page View::SettingsPage {leaf} App - _viewmodel :ExamGeneratorViewModel Application {leaf} + App() # OnLaunched(LaunchActivatedEventArgs) :void - App_Suspending(object, SuspendingEventArgs) :void - ViewModel_ApplicationMessaged(object, ApplicationMessageEventArgs) :void - ViewModel_OpenSettings(object, EventArgs) :void - ViewModel_CloseSettingsExecuted(object, EventArgs) :void -_viewmodel View::MainPage ViewModelBase ViewModel::ExamGeneratorViewModel -_model Model::ExamGeneratorModel Page {leaf} -_timer Model::ElapsedEventArgs - _signaltime :DateTime + ElapsedEventArgs() «property» + SignalTime() :DateTime IDisposable Model::Timer - _timer :ThreadPoolTimer - _interval :TimeSpan - _autoreset :Boolean - _enabled :Boolean + Elapsed :ElapsedEventHandler + Timer() + Timer(Double) - ~Timer() + Start() :void + Stop() :void + Close() :void + Dispose() :void - Timeout(ThreadPoolTimer) :void - Dispose(Boolean) :void «property» + AutoReset() :Boolean + Enabled() :Boolean + Interval() :Double ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:32

Példa Megvalósítás (App.xaml.cs): private void ViewModel_OpenSettings(object sender, EventArgs e) { // átnavigálunk a beállítások oldalra if (!(Window.Current.Content as Frame). Navigate(typeof(SettingsPage))){ } } private void ViewModel_CloseSettingsExecuted( object sender, EventArgs e) { // átnavigálunk a főoldalra if (!(Window.Current.Content as Frame). Navigate(typeof(MainPage))) { } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:33

Példa Megvalósítás (ExamGeneratorViewModel.cs): private async void Model_NumberGenerated( object sender, EventArgs e) { // szinkron műveletben megvárhatjuk az // szinkron végrehajtás végét await CoreApplication.MainView. CoreWindow.Dispatcher. RunAsync(CoreDispatcherPriority.Normal, () => OnPropertyChanged( "QuestionNumber")); // szinkronizált végrehajtás } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:34