Naja, das ganze dürfte äquivalent zur (a)synchronen Programmierung im allgemeinen sein.
Sprich Synchron bedeutet: Du lädst beispielsweise eine Datei herunter und die procedure oder function kehrt zum Hauptprogramm zurück, sobald der Downlaod beendet ist - während selbiges dadurch blockiert wird.
Asynchron bedeutet du startest den Download, und machst mit deinem Programm ganz normal weiter. Wann der Download fertig ist, interessiert dann erstmal nicht (Multithreading vs. Singlethreading).
Oder anderes Beispiel: Du schickst an einen Server eine Anfrage und willst wissen, wie viele Clients er gerade verbunden hat. Bei synchroner Programmierung läuft dein Programm solange nicht weiter, bis es eine Antwort hat. Bei asynchroner ist es egal wann der Server die Antwort schickt, irgendwann kommt sie halt und dann kannst du damit weiterarbeiten.
Dauerhaft offene
TCP-Verbindungen dürften sich sowieso nur asynchron sinnvoll implementieren lassen (da ja sonst irgendwie dein Programm allein durch das offenhalten der Verbindung blockiert würde
).
Vorteil und Nachteil? Ich würde sagen, kommt ganz auf den Einsatzzweck an. Problem (wie bei allen asynchronen Sachen) ist: Die Synchronisierung
Sprich du musst genau aufpassen was du wann mit welchen Daten machen kannst bzw. wann diese zur Verfügung stehen. Das weißt du bei synchroner Programmierung einfach immer sicher!