Cvičenie 10
Dnešnou úlohou bude vytvoriť nástroj na zobrazenie aktuálneho počasia.
Tabuľka je dostupná na http://www.shmu.sk/sk/?page=59
(vytvorte si nový projekt)
HTTP Get & Singleton
Vytvorte si triedu Weather, nech táto trieda obsahuje informácie reprezentujúce jeden záznam z tabuľky.
Vytvorte si rozhranie IHtmlProvider, toto rozhranie nám bude slúžiť dnes len pre jednu triedu - ktorá cez HTTP načíta stránku a predá ju ďalej (v praxi by mohlo túto stránku získať aj inak, napr. načítať z disku, prípadne použiť iný protokol ako HTTP).
Nech toto rozhranie obsahuje jednu metódu string LoadHtml(string url)
Na tomto mieste by sa žiadalo použiť async programovanie, jeho problém je však, že ak ho raz použijete, už sa bude ťahať cez celý kód. O tom, ako to si môžete prečítať viac tu: async concepts
V rámci cvičenia si to ale ukážeme cez klasické vlákna.
- Vytvorte si triedu WebPageProvider, nech táto trieda implementuje IHtmlProvider
- Implementujte rozhranie. Ako na HTTP - použite GET
- Nech táto trieda implementuje [návrhový vzor Singleton] (https://en.wikipedia.org/wiki/Singleton_pattern):
- (všetko v rámci triedy)
- potrebujeme explicitne deklarovaný private konštruktor
- potrebujeme private static referenciu na objekt danej triedy
-
public static IHtmlProvider GetInstance()
nech pri prvom zavolaní vytvorí nový objekt a uloží ho, potom vráti. Pri ďalších zavolaniach nech už len vráti tento vytvorený objekt.
- Vytvorte triedu WeatherParser s jedným parametrickým konštruktom - vstupom bude parameter typu IHtmlProvider. Pridajte metódu
void Parse(string source, Form form, EventHandler handler)
kde získate z IHtmlProvider stránku a pomocou Regexov nájdite a rozdeľte získanú tabuľku a vytvorte z nej zoznam s aktuálnym počasím v daných staniciach. - Pridajte si event, ktorý sa zavolá, keď bude všetko pripravené, aby aktualizoval UI prvky
- Tento raz však budeme pracovať s dvoma vláknami, čo spôsobuje jeden problém: Zmena UI elementov je možná len v hlavnom vlákne, musíme teda nejakým spôsobom zabezpečiť, aby sa kód vykonal v správnom vlákne.
- Pridajte na formulár tlačidlo Load, ktoré zabezpečí načítanie a parsovanie v osobitnom vlákne
//method signature
object Control.Invoke(Delegate method, params object[] args)
//použitie v prípade volania z iného vlákna
form.Invoke(handler, sender, arg1, arg2, arg3, arg4);
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/params
Použite ListBox na zobrazenie menu na výber mesta. Ako na to: https://www.c-sharpcorner.com/UploadFile/mahesh/listbox-in-C-Sharp/
Zabezpečte zobrazenie pre dané mesto pomocou vhodných prvkov. Pri zmene výberu nezabudnite aktualizovať.
Ako bonusovú úlohu sa pokúste v rámci nového projektu urobiť to isté, ale použite async / await
toto si bude vyžadovať zmeny v štruktúre kódu, v tomto prípade ale nepotrebujeme explicitne použit vlákna.
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/