Vytvarime Universal Windows App s asynchronnim behem

Zakladnim pilirem jsou tyto 4 zasady:

  1. Veskere svoje metody, ktere se mohou “zpozdit” oznacit async a s tim je nutne jim dat napriklad typ vracene hodnoty Task<string> v pripade vraceni retezce nebo Task v pripade pouheho vraceni rizeni. Vsechny metody ktere volaji tuto metodu oznacit async a volajici asynchronni metody await a tak az do uplneho konce – v xamlu uz nebudete moci await priradit, to je top uroven.

    Tim davate najevo, ze chcete aby metoda bezela asynchronne. Funguje to tak ze program zacne vykonavat kod ktery nezavisi na zadnem await prikazu. Dokonci await prikazy tak jak jdou za sebou a metoda vrati rizeni. Chytre, ze? 😀 Zapomenout na Task<T>.Wait() a jine metody z Task – to vam prave naopak vlakno nemilosrdne zablokuje!

  2. Bod cislo 1 plati i pro handlery udalosti(napr. stisknuti tlacitka) – prave ony vzdy budou vyvolavat dalsi operace. Konstruktor byt async nemuze.
  3. Metody ktere budou updatovat UI umistit do Page ktera je obsahuje. Zde mate pristup k objektu Dispatcher. Ve WPF/WF se to delalo i pres metodu Invoke. Tady to je lepsi, nemusite vytvaret delegaty a metody k nim, staci pouze obalit volani do Dispatcher.RunAsync
  4. Pokud chcete vykonavat neco ve smycce, jejiz pracujici vlakno nevraci zadnou hodnotu a pak vypsat na status ze vse se podarilo, tak to asi fungovat nebude. Me alespon nefungovalo. Je potreba aby neco tato metoda vlakna vracela – staci bool nebo object, a pred vypsanim konecne hlasky zkontrolujte treba na pocet nebo na equalitu hodnot.
  5. Nad timhle jsem se taky dost natrapil, kdo by rekl, ze pokud chci updatovat polozky v ListBoxu, ktere se zobrazuji pomoci xaml sablony DataTemplate, musim prvne vlastnost ItemsSource vynulovat a pak nastavit znovu na kolekci. Zatim co jsem zkousel to funguje naprosto spolehlive, zadne chyby ze by jeden kod predbihal druhy.

Leave a Reply

Your email address will not be published. Required fields are marked *