Laden...

Wie funktioniert Parallelität bei async/await

Erstellt von dsiuzgfdshg vor 2 Jahren Letzter Beitrag vor 2 Jahren 141 Views
D
dsiuzgfdshg Themenstarter:in
1 Beiträge seit 2021
vor 2 Jahren
Wie funktioniert Parallelität bei async/await

Hallo,
ich setze mich mit asychroner Programmierung auseinander. Wie muss das o.g. Programm schreiben, so dass ""5. Das soll parallel und unabhängig von der async Methode laufen" vor "4. langeBerechnung ist fertig" auftaucht?


using System;
using System.Threading.Tasks;
using System.Threading;

namespace AsyncApp
{
    class Program
    {
       
        static void Main(string[] args)
        {
            DoSynchronousWork();
            Task someTask = DoSomethingAsync2();
            DoSynchronousWorkAfterAwait();
            someTask.Wait(); 
            Console.ReadLine();
        }
        
        //Berechnet einen Wert. Berechnung dauert sehr lange
        static async Task<int> langeBerechnung()
        {
            Console.WriteLine("3. langeBerechnung mach eine lange und komplizierte Berechnung");
            Thread.Sleep(1000 * 4);
            Console.WriteLine("4. langeBerechnung ist fertig");
            return (1);
        }

        static async Task<int> DoSomethingAsync2() 
        {
            Console.WriteLine("2. Async task gestartet...");
            var result=await langeBerechnung();
            return result;
        }
        
        static void DoSynchronousWorkAfterAwait()
        {
            Console.WriteLine("5. Das soll parallel und unabhängig von der async Methode laufen");
        }

        public static void DoSynchronousWork()
        {
            Console.WriteLine("1. Mach was synchrones");
        }
    }
}

16.842 Beiträge seit 2008
vor 2 Jahren

Erklärt in der Microsoft Doku (Asynchrone Programmierung mit async und await) oder auch von Nick Capsas Making async code run faster in C# - YouTube

4.942 Beiträge seit 2008
vor 2 Jahren

Hallo,

wenn du etwas parallel ausführen möchtest, dann starte vorher einen eigenen Task mittels Task.Run(...):


Task.Run(() => DoSynchronousWorkAfterAwait()); // der Name paßt aber dann nicht mehr
await DoSomethingAsync2();

Zum Test benutze dann


static void DoSynchronousWorkAfterAwait()
{
    Console.WriteLine("5. Das soll parallel und unabhängig von der async Methode laufen");
    Thread.Sleep(1000 * 2);
    Console.WriteLine("5. Beendet");
}