Async ohne Await?

  • C#

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von VincentTB.

    Async ohne Await?

    Da paßt doch eine Frage von mir ganz prima hierhin: Oft genug habe ich am Ende einer Prozedur noch eine Sache zu erledigen, die auch prima im Hintergrund laufen könnte. Schreit nach async - aber da ich keine weiteren Aufgaben mehr zu erfüllen habe, brauche ich auch nicht mit await drauf zu warten. Geht also async ohne await ?

    Das passt besser in einen eigenen Thread. #verschoben
    - Solaris

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Solaris“ ()

    Ja, da kommt aber eine Warnung, die Du mit pragma unterdrücken musst (afaik). Dann kannst Du diese Prozedur in einen Task wrappen (await Task.Run(() => ...); Theoretisch kannst Du das await trotzdem einfach hinschreiben, läuft ja auf das selbe raus.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Da habe ich mal irgendwo etwas entdeckt, gehört zu den besten Funktionen, die ich jemals im Internet gefunden habe:

    C#-Quellcode

    1. static class TaskExtensions
    2. {
    3. [MethodImpl(MethodImplOptions.AggressiveInlining)]
    4. public async static void Forget(this Task task)
    5. {
    6. await task.ConfigureAwait(false);
    7. }
    8. }


    Dann kann man einfach immer .Forget machen - ohne Warnung. (Das mit den 1000 Warnungen hat mich immer so genervt)
    Mfg
    Vincent

    wenn du nix awaitest, dann schreib auch kein await hin.
    Die Warnung kommt, wenn gar kein Await-Aufruf erfolgt in der Methode, und dann würde ich ihr Folge leisten, und den Async-Modifizierer halt wegmachen.
    Man sollte wohl besser vom Async.Await-Pattern sprechen, oder nur von Await, wenn man das mittm Async-Modifizierer meint.
    Weil "Async" kann auch andere Variationen von Asynchronizität bedeuten.

    ErfinderDesRades schrieb:

    wenn du nix awaitest, dann schreib auch kein await hin.

    Natürlich schreibe ich kein await hin, wenn ich nichts awaite, sonst würde ich ja was awaiten :D

    Ich glaube, wir sprechen von verschiedenen Warnungen. Ich meine diese hier:


    Mit .Forget kann man diese unterdrücken:


    (SetBackground hat die Signatur ​private async Task SetBackground())
    Mfg
    Vincent

    Ich sehe schon, da bricht gleich ein Glaubenskrieg aus ;) Meine Frage zielte eigentlich darauf ab, ob ein async-Call ohne await den Programmablauf stören ergo ein unberechenbares Verhalten auftreten würde. Aber abgesehen von der Compiler-Warnung wohl nicht ;) Mithin wäre es ohnehin besser, solche Fire-n-Forget-Geschichten in einen Task zu stecken.
    Für die .Forget-Extension hab ich folgenden Ersatz mir ausgedacht:

    C#-Quellcode

    1. var t = Task.Delay(300);


    meine Zeitmessungen ermitteln für .Forget ca 600ms, und für die Dummi-Zuweisung nur 7 ms.
    (Ist wahrscheinlich nicht relevant, wer startet denn schon 10000 Tasks)

    C#-Quellcode

    1. class AwaitTesting {
    2. public static async void Test() {
    3. var sw = Stopwatch.StartNew();
    4. /*
    5. for (var i = -1; i++ < 9999; ) {
    6. var t = Task.Delay(300);
    7. }
    8. */
    9. for (var i = -1; i++ < 9999; ) {
    10. Task.Delay(300).Forget();
    11. }
    12. sw.ElapsedMilliseconds.Dbg();
    13. }
    14. }

    @ErfinderDesRades
    Wow, das hatte ich nicht erwartet. Aber dafür eine Variable zu "verschwenden"? Da müsst ich mir erstmal eine Liste mit foo-Begriffen machen :D

    C#-Quellcode

    1. static class TaskExtensions
    2. {
    3. [MethodImpl(MethodImplOptions.AggressiveInlining)]
    4. public static void Forget(this Task task)
    5. {
    6. }
    7. }


    Damit ist dann .Forget sogar noch schneller:


    Aber wie du schon gesagt hast, das würde niemand machen (10000 Tasks starten) und der Unterschied ist winzig. Aber interessant zu wissen :)
    Mfg
    Vincent