Ασύγχρονη επικοινωνία μπορείς να πετύχεις και με σύγχρονα και με ασύγχρονα sockets. Μπορείς να δημιουργήσεις ένα ξεχωριστό thread το οποίο θα δημιουργεί το σύγχρονο thread. Ο προγραμματισμός του socket είναι ευκολότερος, καθώς απλά καλείς την Receive από το thread και το αφήνεις να περιμένει κάτι. Η επικοινωνία μεταξύ των thread είναι λίγο πιο περίπλοκη. Μπορείς να χρησιμοποιήσεις το BackgroundWorker component για να διευκολύνεις την επικοινωνία μεταξύ των thread, ή ... να διαβάσεις μερικά άρθρα για τη σωστή επικοινωνία μεταξύ thread.
Τα ασύγχρονα sockets είναι πιο περίπλοκα στον προγραμματισμό τους, καθώς πρέπει να δημιουργήσεις διαφορετικές μεθόδους για να αρχίσεις να ακούς και να επεξεργαστείς τα δεδομένα. Επίσης, ο χειρισμός των exceptions είναι πιο δύσκολος, καθώς αυτά δεν θα εμφανιστούν μετά την BeginReceive αλλά όταν θα καλέσεις την EndReceive. Το καλό με τα ασύγχρονα sockets είναι ότι εκμεταλλεύονται την υποστήριξη των network drivers για ασύγχρονη επικοινωνία και έτσι δεσμεύουν πολύ λιγότερους πόρους από τα σύγχρονα.
Η επιλογή σου θα πρέπει να βασιστεί στο ευκολότερος προγραμματισμός ή καλύτερη απόδοση? Ένα συχνό λάθος είναι να υπερεκτιμήσει κανείς τις ανάγκες για απόδοση και να ξοδέψει πολύ χρόνο για να πετύχει την αποδοτικότερη λύση σε λάθος σημείο. Για παράδειγμα, η βάση παίζει πολύ μεγαλύτερο ρόλο στην απόδοση από την επιλογή σύγχρονου/ασύγχρονου socket. Το σωστό transaction management είναι απείρως σημαντικότερο από την ταχύτητα που σου δίνει η μία ή η άλλη υλοποίηση των sockets.
Θα κάνω και ένα τελευταίο σχόλιο όσον αφορά τη χρήση του .NET Remoting. Στην προ-WCF εποχή ο καλύτερος τρόπος να δημιουργήσεις εφαρμογές server ήταν να χρησιμοποιήσεις Enterprise Services. Αυτά σου παρείχαν υπηρεσίες διαχείρισης transaction, concurrency, security, object pooling κλπ. οι οποίες δεν ήταν διαθέσιμες στο .NET Remoting. Υπήρξε από την αρχή όμως η παρανόηση ότι επειδή τα Enterprise Services βασίζονταν στο COM+, θα ήταν προβληματικά σε περιβάλλον .ΝΕΤ. Φυσικά κάτι τέτοιο δεν συμβαίνει, αντίθετα μάλιστα, το .NET Remoting θεωρήθηκε προβληματικό σχεδόν από την αρχή. Εδώ και 4 χρόνια η Microsoft και οι ομιλητές σε ημερίδες και συνέδρια προτείνουν τα Web Services χρησιμοποιούνται για επικοινωνία μεταξύ διαφορετικών συστημάτων, τα Enterprise Services όταν απαιτούνται τα services που παρέχουν (transaction management, concurrecy, security) και το Remoting μόνο για επικοινωνία μεταξύ διαφορετικών εφαρμογών στο ίδιο μηχάνημα.
Με την έλευση του WCF το .NET Remoting ουσιαστικά παροπλίζεται και οι εφαρμογές .NET Remoting θα χρειαστεί να ξαναγραφτούν αν θέλουν να εκμεταλλευτούν τις νέες δυνατότητες.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos