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");
  •   RT @alvinashcraft: Getting Started with Lottie-Windows. #xaml #winui #uwp #windowsdev https://t.co/P4EWilrffA
  •   RT @WindowsUI: We are releasing new samples and documentation today showing how to use the compositor's Visual Layer APIs in win32 apps: ht…
  •   RT @JenMsft: @PXAbstraction With the latest version of W10, you can now tie snipping to PrintScreen - lets you capture things that would ot…
  •   RT @JenMsft: It was so fun to talk to the MVPs today about [REDACTED] 😁 #MVPSummit #MVPBuzz
  •   RT @JenMsft: New build for Fast! Look for 18361 - let us know how it goes once you upgrade! Details here: https://t.co/KCrMGkCsCY 😊 #Window…
  •   @JenMsft Plqn to visit 33?
  •   RT @JenMsft: Image support now rolling out for Sticky Notes if you're in Skip Ahead 😊 #WindowsInsiders Details 👉🏻 https://t.co/6IAdzNYeIs…
  •   RT @ClintRutkas: having a great time discussing Windows Development topics at the #mvpSummit. If you feel a community member is a Microsof…
  •   @NicoVermeir revenge is sweet 🤣
  •   @theothernt found a whole dutch delegation at 4am @ starbucks :)