CoreDispatcher en Tasks in Windows 8

In een eerdere blogposts heb ik al laten zien wat het verscchil is tussen tasks en threads, en eventuele niet voor de handliggende gevolgen bij verkeerd gebruik: http://www.familie-smits.com/post/2012/11/07/Threads-versus-Tasks.aspx

Onlangs was ik met de Dispatcher bezig om weer onderdelen terug de UI thread te invoken en liep ik tegen precies het zelfde aan. Neem het volgende stuk code:

Debug.WriteLine("step 1");
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
            {
                Debug.WriteLine("step 2");
                await Task.Delay(1000);

                Debug.WriteLine("step 3");
            });
            Debug.WriteLine("step 4");

Verwacht zou zijn dat in de Debug window het volgende resultaat verschijn:

step 1

step 2

step 3

step 4

Helaas is dat niet geval en zal 4 eerder worden uitgevoerd dan 3. Dat is het zelfde als we zagen met de threadpool.  Om dit probleem op te lossen heb ik een Extension method geschreven op de CoreDispatcher die dit probleem oplost.

public static class DispatcherExtensions
    {
        public static Task RunTaskAsync(this CoreDispatcher dispather, Windows.UI.Core.CoreDispatcherPriority priority, Func<Task> task)
        {
            TaskCompletionSource<object> tsc = new TaskCompletionSource<object>();
            var t = dispather.RunAsync(priority, async () => 
            {
                try
                {
                    await task();
                    tsc.SetResult(null);
                }
                catch (Exception e)
                {
                    tsc.SetException(e);
                }
            });
            return tsc.Task;
        }
    }
 

Wat als volgt gebruikt kan worden

Debug.WriteLine("step 1");
            await Dispatcher.RunTaskAsync(CoreDispatcherPriority.Normal, async () =>
            {
                Debug.WriteLine("step 2");
                await Task.Delay(1000);

                Debug.WriteLine("step 3");
            });
            Debug.WriteLine("step 4");
  •   @sandeepchads i needed this last week!
  •   @hrist0ph sorry very busy with work at the moment; but working on a rewrite based on the new sdk but not going as fast as i want
  •   @surface thanks but says i am up to date and want all the goodness of 19H1 on my Surface Go
  •   how often i have to press check for updates to force the may update on my surface go 🐱‍👓? #windowsinsiders
  •   @JenMsft Already available to surface go?
  •   RT @windowsblog: Announcing UI Tests in CI/CD for Desktop App Developers https://t.co/3DK2wzAGlX
  •   RT @mrlacey: I get excited about the simplest (obscure?) things sometimes. Yay, XmlnsDefinitionAttribute is coming to .NET Core 3.0, which…
  •   Why does @slack starts faster on my lightweight mobile device then on my heavy powered Core i7 Laptop?
  •   RT @alexmullans: Azure Artifacts is now priced per GB stored 🥳. No more buying and assigning licenses. Start at https://t.co/JAn6daobLV. F…
  •   @LocalJoost i am the creator :) #sorry