C# multithreading, warten ohne GUI zu blockieren?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

GuteAntwort2021 
Fragesteller
 09.07.2022, 21:10

Perfekt, vielen Dank!

0
GuteAntwort2021 
Fragesteller
 10.07.2022, 20:36

Hat bestens funktioniert, vielen Dank!

0

Grundsätzlich kannst du einen Thread verwenden zB den Bereits genannten BackgroundWorker, aber du kannst das ganze auch mit Async und Await lösen was unter Umständen effektiver ist bzw der "neue Weg" ist so etwas zu lösen.


GuteAntwort2021 
Fragesteller
 09.07.2022, 21:45

Wieso "der neue Weg"? Was stimmt mit dem "alten" nicht? ^^

Und es sieht mir so aus, als ob die GUI dann trotzdem noch blockiert werden würde, oder nicht?

0
regex9  10.07.2022, 15:12
@GuteAntwort2021

Der BackgroundWorker erstellt in jedem Fall einen Thread. Bei der Nutzung von async/await ist das im besten Fall nicht notwendig. Genauer gesagt bestimmt die auszuführende Operation, was im Folgenden geschieht. I/O-Operationen bspw. können unabhängig von der CPU laufen, andere Operationen lassen sich aufstückeln und in einer Event Queue abarbeiten oder es wird doch ein Thread beansprucht (sei es ein neuer oder bestehender).

Wenn deine UI durch async/await blockiert wird, wäre anzunehmen, dass du die Technik nicht richtig nutzt, also bspw. keinen Code mit await aufschiebst.

2
GuteAntwort2021 
Fragesteller
 10.07.2022, 20:35
@regex9
Wenn deine UI durch async/awaitblockiert wird, wäre anzunehmen, dass du die Technik nicht richtig nutzt, also bspw. keinen Code mitawaitaufschiebst.

Ich hatte es nicht ausprobiert, nur kurz online geguckt, was es damit auf sich hatte. Bei dem Code ließ es mich vermuten, dass es nicht unabhängig der GUI läuft. Aber ich hatte ehrlich gesagt mich auch nicht richtig damit beschäftigt sondern auch die Antwort von Peter gewartet. ^^

0
PeterKremsner  11.07.2022, 00:44
@GuteAntwort2021

Nein die GUI Blockiert nicht, dass ist ja der Sinn von Async Await.

Im Hintergrund verwendet das ganze eine Art State Machine die im wesentlichen nicht immer einen eigenen Thread benötigt.

Also wenn zB auf IO Operationen gewartet wird braucht man da keinen Thread welcher im Hintergrund einfach nur wartet, das geht auch wenn man einfach weitermacht und sobald die IO Operation fertig ist dann diesen Code ausführt, das geht dann zB auf einem Thread.

Zudem finde ich persönlich die Async Await Methoden einfach besser lesbar.

Für reine Berechnungen die nicht auf etwas warten sondern einfach nur viel Rechenleistung brauchen machts aber keinen wirklichen Unterschied ob Backgroundworker oder Async.

1
GuteAntwort2021 
Fragesteller
 11.07.2022, 01:32
@PeterKremsner

Hmm, mal schauen ob euch richtig verstanden habe.

Kann ich einfach eine Methode wie z. B.

public static async Task EndlessLoop()
{
  await Task.Run(() =>
  {
    while(true)
    {
      Console.WriteLine("Still running");
      WaitForX(1000); //wait 1 second
    }
  });
}

aufrufen, ohne dass diese das restliche Programm blockiert und bekomme obendrein den Vorteil, dass der Compiler selbst entscheidet ob er einen zusätzlichen Thread braucht oder nicht?

0
PeterKremsner  11.07.2022, 09:01
@GuteAntwort2021

Ja sofern du die async Methode entsprechend aufrufst und verwendest. Es gibt dazu eigenen Tutorials.

In dem Fall sagst du aber dem Compiler explizit dass er einen Task erstellen soll.

Wenn du aber zB in deiner Methode await Task.Delay(1000); aufrufst dann kommt es drauf an wie Delay implementiert ist. Wenn Delay aber einen Timer verwendet dann benötigt es keinen Thread für Busy Waiting.

1