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");
  •   having a fun afternoon with #fluent and #rome ; let see if can make something publishable
  •   RT @pag3rd: If you'll be at #MSIgnite and want to learn about what's new with #XAML #FluentDesign and the brand new #WinUI library come to…
  •   RT @kevintgallo: What’s your favorite color? https://t.co/GvhJIb4ItX
  •   @shanselman @tomasrestrepo @h0x0d @joncaves does it mean @satyanadella holds the mic for you next time at build?
  •   @BNR De eindstand (aangekomen op bestemming) https://t.co/DXxHPP57iy
  •   Toch even aan die conditie werken.. Je weet maar nooit @bnr #fiemibo https://t.co/H61vOPrtVi
  •   RT @donasarkar: Hello #WindowsInsiders we have released 19H1 Build 18242 to Skip Ahead! https://t.co/kuo5Y9jt0i
  •   @BNR Zines de 2 jaar dat ik bij bnr heb gewerkt 😊 #ikhoorbijbnr
  •   @JenMsft is there a way to get notfication mirring from android to win desktop without the cortana app (its not available in netherlands)
  •   @tomverhoeff @bartlannoeye i agree with bart in this.. been seeing enough 'good speakers' just delivering 101 sessions all the time