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");
  •   cute how @MicrosoftTeams restart due a glitch when you close the app... makes me wonder what they think the glitch… https://t.co/2TwilGiy1F
  •   Goodie incoming :)
  •   @danhellem @AzureDevOps awesome! :)
  •   @sandeepchads @AzureDevOps it's not there anymore; the morning i had the feature had a banner in the top of the page that had a button "try"
  •   @sandeepchads @AzureDevOps I had the feature yesterday morning on my environment and in the evening it was gone again 😭
  •   @markscholman @windowsdev Thanks! Jij ook!
  •   Another year @windowsdev MVP #MVPBuzz https://t.co/blu1TMBO0E
  •   RT @kevintgallo: Check it out https://t.co/F9exR1pQMx
  •   RT @stanzillaz: The new Windows Terminal is now on the Store https://t.co/n8rjsg19dv #WindowsInsiders
  •   @tfsbuck maybe not that clear as i was using my phone. in the release note notification I still see the annoucement… https://t.co/tx8DDm36q8