KitKat::new() schrieb:
Klingt für mich sehr IO-lastig
Und eigentlich kann man das auch ohne Probleme mit (async) Tasks abbilden; keine Notwendigkeit für explizite Threads
Tasks kommen beim default ThreadScheduler aus'm ThreadPool bei async/await, der ist explizit nicht für langlaufende Operationen gedacht, sondern um den Overhead der Threaderzeugung zu reduzieren. OPs Aufgabe (wenn man sie Multithreaded betrachtet) mindestens einen Thread für die Eingabeverarbeitung, der läuft die ganze Zeit. Ist damit also eigentlich nicht für den Pool gedacht.
Natürlich hast du Recht, dass es damit auch geht, nur wird's halt nicht empfohlen.
Und bzgl. io-lastig, daher habe ich die Abhandlung zu Waithandles etc dahinter aufgeführt. Seine Console Operationen sind alle synchron, Console hat keine async API. Das wrappen von sync in async, um des async willens, ist üblicherweise ein anti-pattern. Siehe u.a.
https://devblogs.microsoft.com/pfxt...synchronous-wrappers-for-synchronous-methods/ (und für die andere Richtung
https://devblogs.microsoft.com/pfxt...ynchronous-wrappers-for-asynchronous-methods/)
Eigene TPL (Task) Methoden zu schreiben, die selber keine weiteren async Methoden aufrufen, bietet sich üblicherweise nur an, wenn man Operationen des OS aufruft die Callback/Waithandle Funktionalität haben, also deinen Code notifizieren können wenn eine entsprechende Operation fertig ist (zb Socket Connect beim Verbindungsaufbau zur Datenbank/Http), dafür stellt das OS sehr effiziente Mechanismen zur Verfügung um diese completion Aufrufe zu machen, je nach OS und Implementierung ist die einfachste Variante ein polling Thread der alle Waithandles kontinuierlich prüft um festzustellen welcher aktuell schlafender thread notifiziert werden muss.
Das ist alles nicht der Fall in dem Beispiel.
99% der Fälle wo man async await nutzen muss, ist weil man eine API nutzen will die TPL (Task Parallel Library) APIs nutzt.
TPL selber richtig zu nutzen ist hinreichend schwer, insb. die Fehlerbehandlung, hat MS ja auch selber realisiert und async/await eingeführt und das Programmiermodell zu vereinfachen.
Bei den ganzen unterschiedlichen Möglichkeiten in .NET für die parallele Abarbeitung von Operationen ist es zugegebenermaßen einfach den Überblick zu verlieren und zugegebenermaßen ist async/await eine einfach zu nutzende Variante für sehr sehr viele Probleme.
Ansonsten wurde schon oben der Link zu Stephen Clearys Blog gepostet, der geht noch weit detaillierter auf die diversen Unterschiede ein.