Tasks - Was ist das?

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Tasks - Was ist das?

    Hi,
    Ich hab mir mal so zum spass die telegram bot api angesehen(github.com/MrRoundRobin/telegram.bot)
    Da bin ich über task funktionen gestolpert, nun wollte ich wissen was das ist, was sich da anders verhält als in normalen funktionen, und was eigendlich dieses "await" ist und warum ich das nicht in einer normalen statischen main void nutzen kann.
    Ich versteh das irgendwie nicht ganz, ich hoffe ihr könnt mir das ein bisschen besser erklähren als die seiten die ich mir dazu durchgelesen habe.
    Mfg
    Wer Rechtschreibfehler findet darf sie behalten :)

    WeLoveBurgers schrieb:

    Ich versteh das irgendwie nicht ganz
    Darauf kann man immer sehr sehr schlecht eingehen, weil man kann immer nur auf konkrete Angaben eingehen, was nicht verstanden wird.
    "das, irgendwie" kann man nicht erklären.

    Kurz kann man sagen, dass Task der Stand der Technik sind, um Nebenläufigkeit zu ermöglichen, und die typischen dabei auftretenden Probleme zu lösen.

    Aber falls du von Nebenläufigkeit und deren typischen Probleme keine konkrete Vorstellung hast, wird dich dieser Definitions-Versuch kaum schlauer machen.

    Wie gesagt: du musst sagen, was du nicht verstehst.
    Tasks repräsentieren in erster Linie mal asynchrone Operationen, auf die Du mlt await warten kannst. Das ist sehr komfortabel und ersetzt die ManualResetEvent-Klasse auch gleich. Außerdem kannst Du immer den Status eines Tasks abfragen (abgebrochen, Exception geworfen etc.)

    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 :!:
    @Trade (und @ErfinderDesRades) Also wie benutze ich dieses await, beispielsweise in der main einer console application? Weil das programm nicht mehr startet wenn ich await einfüge und die vorgeschlagene asynch markierung einfüge...
    Kann ich das auch mit einem handler machen? Also einfach eine void angeben die ausgeführt wird, sobalt der task fertig ist(mit den return results)?
    Gibts da irgendwelche dinge, die ich beachten sollte?(Wie z.b ein delegrate wie bei threads? Oder ähnliches)
    Wie prüfe ich den status eines Tasks?
    .Net4.5 Verwirrt ein wenig^^ ?(
    Ich weis ich bin hier ein wenig anstrengend, ich hoffe dass ihr geduld mit mir habt :D
    Mfg
    Wer Rechtschreibfehler findet darf sie behalten :)
    Was willst Du bei ​Main mit Tasks bzw. async-await hantieren?

    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 :!:

    WeLoveBurgers schrieb:

    console application
    sind nicht dafür gemacht und gedacht, Parallelität von Prozessen zu ermöglichen. Das wäre eine "Vergewaltigung".
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wie schon oben erwähnt, spiele ich gerade mit dem Telegram Bot herum(für monitoring aller art für jeden zu empfehlen übrigens :) ), dort gibt es 2 hauptfunktionen, die erste währe "Bot.GetUpdates", die man nutzt um alle neuen usernachrichten zu empfangen und "Bot.SendTextMessage" um eine nachricht zurückzusenden. Im moment kann ich getupdates ohne probleme auch ohne await ausführen und bekomm eine response(frag mich nicht wie).
    Ich kann auch nachrichten zurücksenden, aber es unterwellt es mir grün und in der überwachung steht dass noch nicht fertig ist( Status WaitingForActivation System.Threading.Tasks.TaskStatus), ich hätte aber auch gern den response davon irgendwie asynchron zurückgegeben.
    @RodFromGermany Wiso denn das? :D
    Wer Rechtschreibfehler findet darf sie behalten :)
    Hey, hier ein paar Links, die ich mir notiert hatte, weil sie mir hilfreich waren.

    Lehrgangsvideo in C# - Alle Basics und auch die Unterschiede zwischen Task.Run und Async/Await werden dort gut und auch für Einsteiger verständlich erklärt.

    Ein Tutorial von @ErfinderDesRades - Leicht verständliche Beispiele. Ebenso wird das Canceln von Tasks behandelt.

    Task.Run vs Backgroundworker - In C#. Stellt die Unterschiede zwischen Tasks und BGW dar. Er hat auch noch einige andere interessante Async/Await und Task Beiträge in seinem Blog. Einfach mal schauen.

    Ansonsten gibt´s auch auf msdn wirklich sehr viele und vorallem auch gute/hilfreiche Beispiele. Zum Einstieg ist sicher dieser Beitrag geeignet. Besonders das Ablaufdiagramm der Asynchronen Programmabarbeitung ist sehr interessant und auch wichtig fürs Verständnis.

    WeLoveBurgers schrieb:

    Gibts da irgendwelche dinge, die ich beachten sollte?

    Weiß nicht wie es in C# ist, aber in Vb kannst du z.B. keine Async Subs Awaiten, denke aber das ist in C# ebenso, da eine Sub ja keinen Rückgabewert hat. Innerhalb der Async Sub kannst du aber z.B. Async Functions etc Awaiten.
    Die Async Functions verhalten sich hingegen anders als die Async Subs. Diese kannste du Awaiten z.B. as Task oder halt auch mit Werten z.B. as Task (Of String) etc.. Und innerhalb der Async Functions kannst du natürlich auch wie bei den Async Subs was Awaiten.


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „rdmguy“ ()

    WeLoveBurgers schrieb:

    Wiso denn das?
    Die Console arbeitet eine Reihe von Befehlen linear ab. Im Prinzip wie eine Batch-Datei: Einstieg, Arbeit, Ausstieg, feddich.
    Parallelisierung dient einmal zur Beschleunigung von Prozessen, wenn man sie in mehrere unabhängig voneinander abarbeitbare Teilprozesse zerlegen kann, z.B. Filter in der Bildverarbeitung, 2-dimensionale Fouriertransformation usw.,
    zum anderen werden Prozesse in einem anderen (parallelen) Thread ausgelagert, um eine GUI nicht zu blockieren, damit sie immer korrekt dargestellt wird und das Programm noch auf Eingaben reagiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @rdmguy Danke, ich werd mich da mal durchwühlen :D
    @RodFromGermany Also für was ich es verwende währe es (glaube ich) hilfreich(korregiere mich wenn ich falsch liege),denn ich habe vor(in meinem beispiel mit dem bot):
    Neue nachrichten suchen -> db queries ausführen-> messages senden -> rückmeldungen ggf auswerten
    Wenn man das klug anstellt sollte man das asynchron schneller/performanter hinbekommen(also für jede nachricht ein eigener asynchroner task)- oder nicht?
    Warum mit einer consolen app? Weil ich das ganze auf einer linux maschiene zum monitoren laufen hab.
    Mfg
    Wer Rechtschreibfehler findet darf sie behalten :)
    Ein ​Task ist 'ne Aufgabe, die Du asynchron ausführen kannst, geht aber genauso synchron: msdn.microsoft.com/en-us/library/dd321435(v=vs.110).aspx

    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 :!:

    WeLoveBurgers schrieb:

    consolen app
    wo Du die MessageLoop einer Form/WPF-Anwendung nachbaust?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Haben tasks irgendein limit von dem ich wissen sollte oder warum arbeiten die nicht so wie erwartet?
    Also ich meine, wenn ich das mit eine stopwatch abstoppe, kommt da als ElapsedMilliseconds 15711 raus, aber der tutor im video oben meinte doch, dass das jetzt nurnoch so lang dauert, wie das längste void, also 1 sekunde, oder? das referenzierte vid:
    Code:
    Spoiler anzeigen

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. Stopwatch sw = Stopwatch.StartNew();
    4. Console.WriteLine("Starting all");
    5. List<Task<int>> tlist = new List<Task<int>>();
    6. for (int i = 0; i < 50; i++) {
    7. tlist.Add(Task.Factory.StartNew<int>(lel));
    8. }
    9. Console.WriteLine("Started all {0}", sw.ElapsedMilliseconds);
    10. Task.WaitAll(tlist.ToArray());
    11. Console.WriteLine("waited all {0}", sw.ElapsedMilliseconds);
    12. Console.ReadLine();
    13. }
    14. static Random rnd = new Random();
    15. private static int lel() {
    16. int zahl = rnd.Next(100,1000);
    17. Console.WriteLine("sth {0}", zahl);
    18. Thread.Sleep(zahl);
    19. Console.WriteLine("stf {0}", zahl);
    20. return zahl;
    21. }

    Ps: @RodFromGermany Ich versteh die fragestellung nicht ganz :(
    Mfg
    Wer Rechtschreibfehler findet darf sie behalten :)

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „WeLoveBurgers“ ()

    WeLoveBurgers schrieb:

    fragestellung
    Willst Du das eigentliche Problem in einer Console-Applikation entwikeln?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Im moment ist es egal als welche app ich es programmiere, zuallererst will ich einmal die funktionsweise von tasks verstehen. (Aber ja, wenn ich die verstanden hab, werd ich warscheinlich auch ein paar consolen apps damit schreiben)
    Also wie gesagt, bei mir funktionieren sie nicht wie sie sollen(oder ich mir denke wie sie sollen :( )
    Wer Rechtschreibfehler findet darf sie behalten :)

    WeLoveBurgers schrieb:

    wenn ich die verstanden hab
    solltest Du keine Consolen-Apps damit schreiben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sieht doch eiglich nicht so schlecht aus.

    Ich hab zwar nie solche Experimente gemacht, aber vom Threadpool her kenne ich das auch, dass der ziemlich träge ist mittm Warming up.

    Du könntest den Test mal ein paarmal hinternander durchlaufen lassen, vlt. verbessert sich dann die Zeit allmählich.

    Was der Tutor im Vid sagt - sorry, ich werd mir jetzt kein Vid angugge - kommt iwas darin vor, was hier für von Belang ist, und wenn ja was wäre das?

    @Rod: Warum soll er keine Consolen-App schreiben?
    Bislang sinds doch nur Experimente, damit wird man doch nie einen User verärgern.
    Ich weiß auch garnet, wasser wirklich vorhat iwas was so ähnlich ist, wie ein anneres Programm, was ich nicht kenne. Aber wenns ihn freut 50 Tasks parallel ein paar zig Millisekunden warten zu lassen - warum denn nicht? (bzw. warum darf das nicht in einer Konsole geschehen?)
    @RodFromGermany Ich werds mir zu herzen nehmen :D
    @ErfinderDesRades Er macht zuerst sowas wie ich hier, nur ohne tasks, lässt die ausführen und sagt, dass die langsam sind, dann macht er das ganze mit den tasks und bei ihm kommt das dann raus dass es nur 8,002 sekunden brauch(längster thread braucht wegen dem sleep 8 sekunden(bei 16 minuten videozeit)), bei mir kommt das nicht so ganz hin.
    Ok, er hat auch "nur" 5 tasks, ich 50+, aber macht das einen unterschied?
    Und ja, kann sein dass er mit der zeit schneller wird, komischerweise :D
    Meine tasks verhalten sich generell komisch:
    Zur liste adden+starten: 50 millisekunden- ok
    Aber dann, kommt die erste meldung "sth [zahl]"nach ca einer halben sekunde, die tasks danach auch sowas mit 0 bis einer halben sekunde zum vorhergehenden versetzt.
    Mfg
    Wer Rechtschreibfehler findet darf sie behalten :)