Laden...

Async Await Verständnis Probleme

Erstellt von Magier69 vor 3 Jahren Letzter Beitrag vor 3 Jahren 431 Views
M
Magier69 Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren
Async Await Verständnis Probleme

Hallo Leute,
ich versuche seit einigen Tagen den Sinn & Zweck von Async Await zu verstehen,
was mir leider noch nicht gelungen ist.

Kann mir wer erklären was der Vorteil gegenüber von einem einfachen
Task.Run() ist !?!?

Hier meine Tests....


        static void Main(string[] args)
        {
            var x=Test();
            var y=Task.Run(Test2);

            y.Wait();
            x.Wait();
            Console.WriteLine("READY");
            Console.ReadKey(true);
        }

        public static async Task<int> Test()
        {
            var t = Task.Run(() =>
            {
                for (int i = 0; i < 80; i++)
                    Console.WriteLine("TEST" + i);
            });
            await t;
            return 123;
        }

        public static int Test2()
        {
           for (int i = 0; i < 80; i++)
               Console.WriteLine("T2 " + i);
           return 999;
        }
6.911 Beiträge seit 2009
vor 3 Jahren

Hallo Magier69,

bei deinen Tests hat es keinen Vorteil.

Stell dir aber vor du willst eine IO-Operation (Input, Output) wie z.B. Netwerkzugriffe ala Datenbankabfrage, Web-Request, etc. durchführen so würde bei


var result = service.GetData(...);
UseResult(result);

der ausführende Thread blockiert werden, bis das Ergebnis vorliegt. Das ist nicht ideal.

Daher gibt es asynchrone IO-Vorgänge, bei denen ein Task erzeugt wird und keinen Thread blockiert, sondern bei "Abschluss" des IO-Vorgangs ein sogenannter IO-Thread vom ThreadPool verwendet wird um das "Callback" durchzuführen. Hier eignet sich async/await, da eleganter Code geschrieben werden kann der leserlich ist.


var result = await service.GetDataAsync(...);
UseResult(result);

service.GetDataAsync gibt dabei eine Task zurück, der C#-Compiler erkennt das async/await und erstellt für dich Code der sehr grob analog zu


Task resultTask = service.GetDataAsync(...);
resultTask.ContinueWith(t => UseResult(t.Result));

ist. Da ist der "await Code" schon leserlicher, v.a. wenn mehrere awaits in einer Methode sind.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
Magier69 Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren

Hallo gfoidl,
danke für Deine Nachricht.
Ja, ich glaube ich kann es .... langsam... nachvollziehen.
Da muss ich mich noch anfreunden damit... 😃

VG
Magier69

6.911 Beiträge seit 2009
vor 3 Jahren

Hallo Magier69,

anfreunden damit...

Ja mach das und probiers einfach aus, dann kannst Freude damit haben das es viel umständlichen Code erspart.

Sonst frag einfach wieder im Forum nach 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

16.833 Beiträge seit 2008
vor 3 Jahren

Und wichtig:
Asynchrone Programmierung ist nicht dazu da, dass Dein Code schneller läuft - das tut er nicht.
Der Sinn ist, dass Code nicht mehr blockiert - und das hat in vielen Fällen die Folge, dass die Ressourcen der ausführenden Umgebung (zB. Dein PC) effizienter genutzt werden und insgesamt mehr geleistet werden kann.