Nezkoušel jsem to z Visual Studia, ale můj odhad je: Proč mi zase zamrzlo UI? - async/await nezajišťuje automaticky paralelizaci, slouží pouze pro usnadnění práce s Task objektem a zpětnou synchronizací - tady celý kód proběhl synchronně v hlavním vlákně protože i přes použití "await" se uvnitř metody vše provedlo synchronně (žádné čekání na awaitable objekt) Proč to proběhlo rychleji, než chci? - 1 - Tento příkaz nečeká, ale vytváří objekt Task, který bude označen za dokončený až po předaném intervalu, viz: http://msdn.microsoft.com/cs-cz/library/... Proč to proběhlo rychleji, než chci? - 2 - Tahle úloha mi chvilku trvala. Příkaz StartNew spustí task předaný delegátem a vrací jeho výsledek. V tomhle případě ale vrací Task<Task> protože vnitřní volání je asynchronní a má tedy výsledek Task. A metoda await vyčká na dokončení tasku Task<Task> a vrátí jeho výsledek, tedy vnitřní Task, který reprezentuje čekání. Nikdo ale už nečeká na dokončení tohoto vnitřního Tasku. Myslím, že zavolání "await" dvakrát za sebou by mohlo fungovat a čekalo by se i na dokončení výsledku metody Delay. Tak kdy už to skončí? - 1 - Tady záleží na sychronizačním kontextu a vlákno, ze kterého je událost vyvoláná. V případě formulářových aplikací (smyčka zpráv) dojde k deadlocku, protože hlavní vlákno je blokované a synchronně čeká (metoda Wait) na dokončení tasku. Ten task ale uvnitř po dokončení úlohy čekání snaží předat vykonávání synchronizačním kontextem na hlavní vlákno, což ale není možné, protože smyčka hlavního vlákna je blokovaná. Tak kdy už to skončí? - 2 - Tady nevidím žádný problém.
|