Vytváříme Universal Windows App s asynchronním během

Základním pilířem jsou tyto 4 zásady:

  1. Veškeré svoje metody, které se mohou „zpozdit“, označit async a s tím je nutné jim dát například typ vrácené hodnoty Task<string> v případě vrácení řetězce nebo Task v případě pouhého vrácení řízení. Všechny metody, které volají tuto metodu, označit async a volající asynchronní metody await a tak až do úplného konce – v xamlu už nebudete moci await přiřadit, to je top úroveň.
    Tím dáváte najevo, že chcete aby metoda běžela asynchronně. Funguje to tak, že program začne vykonávat kód, který nezávisí na žádném await příkazu. Dokončí await příkazy tak, jak jdou za sebou, a metoda vrátí řízení. Chytré, že? 😀 Zapomenout na Task<T>.Wait() a jiné metody z Task – to vám právě naopak vlákno nemilosrdně zablokuje!
  2. Bod číslo 1 platí i pro handlery události (např. stisknutí tlačítka) – právě ony vždy budou vyvolávat další operace. Konstruktor být async nemůže.
  3. Metody, které budou updatovat UI, umístit do Page, která je obsahuje. Zde máte přístup k objektu Dispatcher. Ve WPF/WF se to dělalo i přes metodu Invoke. Tady to je lepší, nemusíte vytvářet delegáty a metody k nim, stačí pouze obalit volání do Dispatcher.RunAsync
  4. Pokud chcete vykonávat něco ve smyčce, jejíž pracující vlákno nevrací žádnou hodnotu a pak vypsat na status, že vše se podařilo, tak to asi fungovat nebude. Mě alespoň nefungovalo. Je potřeba, aby něco tato metoda vlákna vracela – stačí bool nebo object, a před vypsáním konečné hlášky zkontrolujte třeba na počet nebo na equalitu hodnot.
  5. CSHARP
    async Task SetItemsToDownloadQueueListBox()
    {
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                downloadQueueListBox.ItemsSource = null;
                downloadQueueListBox.ItemsSource = VideosInListBox.videos;
            }
        );
    }

    Nad tímhle jsem se taky dost natrápil, kdo by řekl, že pokud chci updatovat položky v ListBoxu, které se zobrazují pomocí xaml šablony DataTemplate, musím prvně vlastnost ItemsSource vynulovat a pak nastavit znovu na kolekci. Zatímco jsem to zkoušel, funguje to naprosto spolehlivě, žádné chyby, že by jeden kód předbíhal druhý.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *