Async/Await richtig verstehen mit "ConfigureAwait(false)"!?



  • Guten Morgen Leute,

    ich habe schon bissel recherchiert umd "ConfigureAwait(false)" der TPL zu verstehen. Wenn ein Task mit ConfigureAwait(false) markiert versehen wird, dann kommt dieser in einem "anderen" Thread Context zurück.. was ich gar nicht verstehen was damit gemeint ist

    Aber zuerst, habe ich den überhaupt Async/Await verstanden? Nehmen wir an ich habe 3 Aufgaben seriell zu erledigen, und jede Aufgabe gibt ein Ergebnis für die nächste zurück. Dann würde ich das ganze so mit der TPL machen:

    async void DoCompleteWorkAsync()
         {
             object data = ...;
             object myResult = null;
    
             var resA = await DoWorkAAsync(data);
             var resB = await DoWorkBAsync(resA);
             var resC = await DoWorkCAsync(resB);
    
             myResult = resC;
         }
    

    Das ist schonmal klar (denk ich). Wenn ich das ganze nun mit klassischen Thread (ohne den async/await syntatic sugar), lösen würde, würde das so ausehen : (hier verschachtele ich die Kontexte der Threads)

    VAriante A:

    void DoCompletWorkA()
          {
              object data = 0;
              object myResult = null;
    
              var waitAll = new AutoResetEvent(false);
    
              ThreadPool.QueueUserWorkItem((i) =>
              {
                 var resA= DoWorkA(i);
    
                 ThreadPool.QueueUserWorkItem((i1) =>
                 {
                     var resB = DoWorkB(i1);
    
                     ThreadPool.QueueUserWorkItem((i2) =>
                     {
                         var resC = DoWorkC(i2);
                         myResult = resC;
                         waitAll.Set();
    
                     }, resB);
    
                 }, resA);
    
              }, data);
    
              waitAll.WaitOne();
          }
    

    und nun Variante B (welche dann async/await mit ConfigureAwait gleicht.. richtig??) :

    void DoCompletWorkB()
         
    {
              object data = 0;
              object myResult = null;
    
              var waitAll = new AutoResetEvent(false);
    
              object resA = null;
              ThreadPool.QueueUserWorkItem((i) =>
              {
                  resA = DoWorkA(i);
                  waitAll.Set();
    
              }, data);
              waitAll.WaitOne();
    
              
              object resB = null;
              ThreadPool.QueueUserWorkItem((i1) =>
              {
                  resB = DoWorkB(i1);
                  waitAll.Set();
    
              }, resA);
              waitAll.WaitOne();
    
              
              object resC = null;
              ThreadPool.QueueUserWorkItem((i2) =>
              {
                  resC = DoWorkC(i2);
                  waitAll.Set();
    
              }, resB);
              waitAll.WaitOne();
    
              myResult = resC;
          }
    

    hier springe ich immer wieder nach jeder Arbeit in den ursprungs Kontext zurück.. ist nun das was ConfigureAwait(false) tut?

    Oder habe ich generell was nicht kapiert?;)


Log in to reply