Základním pilířem jsou tyto 4 zásady:
- Veškeré svoje metody, které se mohou „zpozdit“, označit
asynca s tím je nutné jim dát například typ vrácené hodnotyTask<string>v případě vrácení řetězce neboTaskv případě pouhého vrácení řízení. Všechny metody, které volají tuto metodu, označitasynca volající asynchronní metodyawaita tak až do úplného konce – v xamlu už nebudete mociawaitpř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émawaitpříkazu. Dokončíawaitpříkazy tak, jak jdou za sebou, a metoda vrátí řízení. Chytré, že? 😀 Zapomenout naTask<T>.Wait()a jiné metody zTask– to vám právě naopak vlákno nemilosrdně zablokuje! - 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
asyncnemůže. - Metody, které budou updatovat UI, umístit do
Page, která je obsahuje. Zde máte přístup k objektuDispatcher. Ve WPF/WF se to dělalo i přes metoduInvoke. Tady to je lepší, nemusíte vytvářet delegáty a metody k nim, stačí pouze obalit volání doDispatcher.RunAsync - 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.
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ý.