C# - Eine Methode/Funktion im Hintergrund ohne zu warten ausführen.

  • C#
  • .NET 4.0

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    EaranMaleasi schrieb:


    Also ist ein await nicht notwendig. Die Methode läuft durch den Task trotzdem asynchron und blockiert die GUI nicht, korrekt?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo exakt.

    Man hat nun 3 Möglichkeiten in der aufrufenden Funktion mit dem zurückgegebenen Task umzugehen:
    1. Synchrones warten mit Task.Result bzw. Task.Wait() was jedoch wieder die GUI blockiert.
    2. Asynchrones warten mit await bzw. Task.ContinueWith(), wobei es afaik keinen Grund gibt nicht await zu nehmen außer man Arbeitet mit .NET 4.0
    3. Fire&Forget. Dies bedeutet, man ruft die Methode auf, startet den Task, wartet jedoch nicht auf seine Beendigung, und fährt einfach fort.

    Was man jedoch nach wie vor niemals tun sollte,(und afaik auch nicht kann) ist aus einem Task heraus auf die GUI zuzugreifen.
    Tasks sind dazu da einzelne Aufgaben so auszulagern, dass die GUI immer ansprechbar bleibt, nicht jedoch um in ihr herumzufuhrwerken.
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
    Hallöchen,

    na da sind ja von gestern auf Heute ein paar Antworten dazu gekommen.

    Also wenn ich so einen Task drum mache (geht das dann mit allem ? also könnte ich theoretisch auch einen 100 Zeilen code darein schreiben ?) dann
    läuft das ganz OHNE await asynchron. Nun stellt sich mir die Frage warum in diesem Szenario die Messagebox kommt obwohl man noch nicht bei 50k angelangt ist ?

    Denn wenn ich das richtig verstanden habe sollte das doch nun nicht async laufen ? Sondern eigentlich NUR wenn ich das ganze mit return Task.Run mache..
    Ich bin verwirrt. Es tut mir echt leid das ich da nun nochmal nachfrage, aber besser zu viel Fragen als zu wenig und man lernt was Falsch.

    Habe mal ein paar Sekunden Video gemacht um das zu demonstrieren...

    d.kevinmueller.eu/03.2018/13.1520942420.mp4

    Desweiteren habe ich den ThreadTitel angepasst um das "void" da wegzumachen
    Grüße , xChRoNiKx
    Du stößt eine asynchrone Verarbeitung an ohne mit await darauf zu warten. Damit kommt natürlich direkt die MessageBox.
    ALTERNATIV kannst du mit Tasks arbeiten und auf diese warten oder nicht.

    Async mit await ist eine Vereinfachung für Task.Continue with, wie EaranMaleasi schon beschrieben hat.
    Du musst dich nur für eine Methodik entscheiden, das ist eine Frage des Gefallens.
    Gruß Murdoc
    Nene, moment, nicht so schnell. Das ist nur der Effekt, weil das Ausgabefenstern in Visual Studio arsch langsam ist. Da ist nix Asynchron. Schreib den Code mal so:

    C#-Quellcode

    1. private async void button1_Click(object sender, EventArgs e) {
    2. MessageBox.Show("1");
    3. testAsync();
    4. MessageBox.Show("3");
    5. }
    6. public async Task testAsync() {
    7. Thread.Sleep(2000);
    8. MessageBox.Show("2");
    9. }