Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 2585|Απάντηση: 2

[Πηγή] Εξερευνήστε θέματα στην επέκταση .Net Reactive Responsive

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 27/1/2024 12:17:19 μ.μ. | | | |
Η επέκταση .Net Reactive παρέχει στους προγραμματιστές ένα σύνολο δυνατοτήτων για την εφαρμογή ενός αντιδραστικού μοντέλου προγραμματισμού για προγραμματιστές .Net για να κάνουν τον χειρισμό συμβάντων απλούστερο και πιο εκφραστικό χρησιμοποιώντας δηλωτικές ενέργειες. Ενώ οι βασικοί ακρογωνιαίοι λίθοι της αντιδραστικής κλιμάκωσης είναι οι διεπαφές IObserver και IObservable, ως προγραμματιστής, συχνά δεν χρειάζεται να εφαρμόσετε αυτές τις διεπαφές μόνοι σας. Η βιβλιοθήκη υποστηρίζει τον ενσωματωμένο τύπο Subject<T>, ο οποίος υλοποιεί διεπαφές και υποστηρίζει πολλές λειτουργίες.

Τα θέματα αποτελούν τη βάση για τα διάφορα θέματα που είναι διαθέσιμα στη βιβλιοθήκη και υπάρχουν και άλλα θέματα - ReplaySubject<T>, BehaviorSubject<T> και AsyncSubject<T>. Είναι χρήσιμο να κατανοήσετε τις ουσιαστικές διαφορές μεταξύ τους και πώς να τις χρησιμοποιήσετε για να κάνετε καλύτερη χρήση της βιβλιοθήκης.

Σε αυτό το άρθρο, θα συγκρίνουμε το Υποκείμενο<T> και τον αδερφό του, προσπαθώντας να δείξουμε τις διαφορές μεταξύ της συμπεριφοράς τους.

Θέμα<T>

Όπως αναφέρθηκε προηγουμένως,<T> το Subject είναι η βάση για τα διαθέσιμα θέματα, παρέχοντας έναν εύκολο τρόπο χρήσης της βιβλιοθήκης χωρίς να χρειάζεται να υλοποιήσετε μόνοι σας τις διεπαφές IObservable<T> και IObserver<T>. Μια απλή επίδειξη του τύπου θέματος φαίνεται παρακάτω.

Στον παραπάνω κώδικα, δημιουργήσαμε μια <T>παρουσία του Subject και δεδομένου ότι υλοποιεί το<T> IObserver και το IObserverable<T>, χρησιμοποιήστε το ίδιο στιγμιότυπο για να εγγραφείτε και να δημοσιεύσετε την τιμή στο IObserver. Ένα άλλο σημαντικό σημείο που πρέπει να σημειωθεί εδώ είναι πώς χρησιμοποιούμε την υπερφόρτωση της μεθόδου Subscribe για να δεχτούμε ενέργειες ως είσοδο. Αυτό θα γίνει για κάθε δημοσιευμένη τιμή, σε αυτήν την περίπτωση εκτυπώνοντας τον αριθμό στην κονσόλα.

Ας προσπαθήσουμε να εμφανίσουμε τις δημοσιευμένες τιμές και τις τιμές που εκτυπώνει ο διακομιστής IObserver (σε αυτήν <T>την ενέργεια) στην κονσόλα στην παρακάτω εικόνα. Αυτό θα μας βοηθήσει να συγκρίνουμε εύκολα τα υπόλοιπα αδέρφια και τις παραλλαγές.



Η πρώτη γραμμή αντιπροσωπεύει τη δημοσιευμένη τιμή και η δεύτερη γραμμή αντιπροσωπεύει την τιμή που έλαβε ο διακομιστής IOb. Επιπλέον, προσθέσαμε μια γραμμή για να υποδείξουμε σε ποιο σημείο ο παρατηρητής εγγράφεται στη ροή κατά την εκτέλεση. Αυτή η γραμμή αντιπροσωπεύεται από μια κάθετη διακεκομμένη γραμμή.

Στον παραπάνω κώδικα, παρατηρήσαμε ότι ο παρατηρητής εγγράφηκε στη ροή δεδομένων πριν δημοσιεύσει την πρώτη τιμή. Η εικόνα δείχνει τη γραμμή Συνδρομητή τοποθετημένη πριν από το πρώτο στοιχείο. Όπως μπορείτε να δείτε από τη γραμμή εξόδου, αυτό δεν έχει καμία επίδραση στην έξοδο (σε αυτό το σημείο).

Τι γίνεται όμως αν ο παρατηρητής προσυπογράψει τα δεδομένα μόνο αφού έχουν ήδη δημοσιευτεί ορισμένες τιμές; Έχει αυτό αντίκτυπο στα δεδομένα που λαμβάνουν οι παρατηρητές; Πριν δούμε την έξοδο, ας γράψουμε πρώτα τον ίδιο κώδικα.

Στον παραπάνω κώδικα, μπορούμε να παρατηρήσουμε ότι ο παρατηρητής εγγράφεται στη ροή δεδομένων μόνο αφού δημοσιευτούν δύο τιμές (1 και 2). Όπως θα περίμενε κανείς, αυτό θα κάνει τους παρατηρητές να μην λαμβάνουν δεδομένα που δημοσιεύονται πριν καλέσουν τη μέθοδο συνδρομής. Όπως φαίνεται στο παρακάτω σχήμα.



Τι γίνεται αν θέλετε να διαβάσετε όλες τις δημοσιευμένες τιμές, ακόμα κι αν ο παρατηρητής εγγραφεί καθυστερημένα; Εδώ μπαίνει στο παιχνίδι το ReplaySubject<T>.

Θέμα επανάληψης<T>

Το ReplaySubject<T> αποθηκεύει προσωρινά τις τιμές και τις αναπαράγει ξανά για μεταγενέστερους συνδρομητές. Αυτό είναι χρήσιμο για την αποφυγή συνθηκών αγώνα. Ας αλλάξουμε τον προηγούμενο κώδικα για να χρησιμοποιήσουμε το ReplaySubject<T> και ας δούμε πώς επηρεάζει αυτό που λαμβάνει ο παρατηρητής.

Όπως φαίνεται στον παραπάνω κώδικα,<T> <T>δεν υπάρχει σχεδόν καμία αλλαγή στον κώδικα εκτός από το ότι τώρα χρησιμοποιούμε το ReplaySubject αντί για το subject. Το παρακάτω διάγραμμα απεικονίζει τον αντίκτυπο στα δεδομένα που λαμβάνει ο παρατηρητής.



Όπως φαίνεται στην εικόνα, η αποθηκευμένη τιμή αναπαράγεται τώρα στον συνδρομητή, ακόμη και αν ο συνδρομητής εγγραφεί αργότερα. Φυσικά, αυτή η χρήσιμη λειτουργία έχει ένα τίμημα. Αυτή η υλοποίηση θα αποθηκεύσει προσωρινά κάθε τιμή που δημοσιεύεται από τον συνδρομητή, γεγονός που μπορεί να προκαλέσει προβλήματα κακής μνήμης όταν ο όγκος των δεδομένων είναι σημαντικά μεγαλύτερος.

Ωστόσο, το ReplaySubject<T> έχει περισσότερους από έναν τρόπους για να λύσει αυτό το πρόβλημα. Για χάρη αυτού του παραδείγματος, θα δούμε δύο παραδείγματα που θα χρησιμοποιήσουν περιορισμούς μεγέθους και χρόνου για να περιορίσουν την τιμή στο cache.

Ως πρώτη περίπτωση, θα χρησιμοποιήσουμε το μέγεθος της προσωρινής μνήμης για να περιορίσουμε την τιμή της προσωρινής μνήμης. <T>Ο κατασκευαστής του ReplaySubject παρέχει μια υπερφόρτωση, η οποία δέχεται έναν ακέραιο αριθμό που αντιπροσωπεύει το μέγεθος της προσωρινής μνήμης (μέγιστος αριθμός στοιχείων). Στο παράδειγμά μας, ας αλλάξουμε τον κώδικα για να περιορίσουμε το μέγεθος της προσωρινής μνήμης σε 1.

Σημειώστε πώς χρησιμοποιούμε <T>την υπερφόρτωση κατασκευαστή του ReplaySubject για να παρέχουμε το μέγεθος της προσωρινής μνήμης ως 1. Αυτό περιορίζει την προσωρινή αποθήκευση και διασφαλίζει ότι μόνο ένα στοιχείο αποθηκεύεται προσωρινά και αντικαθίσταται με ένα νέο στοιχείο αμέσως μόλις δημοσιευτεί. Ο αντίκτυπος της αλλαγής φαίνεται παρακάτω.



Ένας άλλος τρόπος για να περιορίσετε την προσωρινή αποθήκευση είναι να περιορίσετε το χρόνο του αποθηκευμένου στοιχείου ή με άλλα λόγια, να παρέχετε ένα χρόνο λήξης για το αποθηκευμένο στοιχείο.

Ας γράψουμε κώδικα για να επεξηγήσουμε αυτό το παράδειγμα.

Παρόμοια με τον προηγούμενο κώδικα, χρησιμοποιούμε<T> την υπερφόρτωση του κατασκευαστή ReplaySubject για να καθορίσουμε τον χρόνο λήξης των στοιχείων στην κρυφή μνήμη. Για να δείξουμε την υπόθεσή μας, εισαγάγαμε μια καθυστέρηση μεταξύ της απελευθέρωσης των τιμών.

Δεδομένου ότι χρειάζονται 1200 ms για να εγγραφεί ο παρατηρητής, τυχόν στοιχεία που υπερβαίνουν τον χρόνο λήξης των 1000 ms θα αφαιρεθούν από την κρυφή μνήμη. Σε αυτό το παράδειγμα, αυτό θα προκαλέσει την κατάργηση της τιμής 1 από το cache και δεν θα αναπαραχθεί ξανά σε καθυστερημένους συνδρομητές. Όπως φαίνεται στο παρακάτω σχήμα.



<T>Υπάρχουν και άλλες υπερφορτώσεις για το ReplaySubject που παρέχουν μεγαλύτερη ευελιξία και ρυθμίζουν με ακρίβεια τις αποθηκευμένες τιμές, αλλά για παραδείγματα, θα διατηρήσουμε τα δύο παραδείγματα που έχουν ήδη καλυφθεί παραπάνω.

ΣυμπεριφοράΥποκείμενο<T>

Το BehaviourSubject <T>μοιάζει πολύ με το ReplaySubject<T> στο ότι βοηθά στην προσωρινή αποθήκευση τιμών. Υπάρχει όμως μια σημαντική διαφορά. Το BehaviourSubject<T> αποθηκεύει προσωρινά μόνο την τελευταία δημοσιευμένη τιμή. Πριν προχωρήσουμε σε αυτό, ας γράψουμε λίγο κώδικα.

Εάν το BehaviorSubject<T> αποθηκεύει προσωρινά μόνο μία τιμή (η οποία είναι τελευταία γνωστή), σε τι διαφέρει από ένα ReplaySubject μεγέθους 1<T>; Το παρακάτω διάγραμμα αντικατοπτρίζει σαφώς την κατάσταση του παραπάνω κώδικα.



Ωστόσο, αυτό δεν είναι απολύτως αληθές. Υπάρχουν δύο σημαντικές διαφορές που πρέπει να κατανοήσουμε εδώ. Το πρώτο είναι η παρουσία προεπιλογών. Σημειώστε ότι στον παραπάνω κώδικα, <T>παρέχουμε την τιμή 0 ως προεπιλογή στον κατασκευαστή του BehaviourSubject. Εάν δεν υπάρχει τιμή στην κρυφή μνήμη (ή με άλλα λόγια, δεν δημοσιεύτηκαν δεδομένα πριν εγγραφεί ο παρατηρητής), η προεπιλεγμένη τιμή θα επιστραφεί. Αυτό είναι διαφορετικό από το ReplaySubject, το οποίο έχει μέγεθος 1<T>, το οποίο δεν έχει καμία τιμή. Ο ακόλουθος κώδικας και μια οπτική αναπαράσταση της ακολουθίας δείχνει αυτή τη συμπεριφορά.



Η δεύτερη διαφορά είναι πώς<T> συμπεριφέρονται τα BehaviorSubject και ReplaySubject<T> κατά την εγγραφή σε μια ολοκληρωμένη ακολουθία. Όταν εγγραφείτε μετά την ολοκλήρωση, το BehaviorSubject <T> δεν θα έχει καμία τιμή, όπως φαίνεται στον παρακάτω κώδικα.

Οι συνδρομητές είναι εγγυημένοι ότι δεν θα λάβουν καμία αξία επειδή οι συνδρομές πραγματοποιούνται μετά την ολοκλήρωση.



Ωστόσο, <T>αυτό συμβαίνει με το ReplaySubject . Δεν υπάρχει καμία εγγύηση ότι ο παρατηρητής δεν θα λάβει τιμές, όπως φαίνεται στον παρακάτω κώδικα.

Όπως φαίνεται στον παραπάνω κώδικα, η κρυφή μνήμη έχει μέγεθος 1 και ακόμη και αν η συνδρομή κληθεί μετά την ολοκλήρωση της κλήσης, η κρυφή μνήμη θα παραμείνει (μέχρι να εκπληρωθεί η συνθήκη λήξης), οπότε σε αυτήν την περίπτωση θα ληφθεί η τελευταία δημοσιευμένη τιμή.



ΑσύγχρονοΘέμα<T>

Το AsyncSubject <T>είναι το τελευταίο αδερφάκι του Θέματος που θα εξερευνήσουμε σε αυτό το άρθρο <T>και μοιάζει πολύ με τα δύο προηγούμενα (ReplaySubject και BehaviourSubject) στο ότι αποθηκεύει επίσης προσωρινά τα αποτελέσματα. Αλλά και πάλι υπάρχει μια σημαντική διαφορά. Το AsyncSubject δημοσιεύει την τελευταία τιμή στο cache μόνο αν η ακολουθία έχει επισημανθεί ως ολοκληρωμένη <T> (αποθηκεύει στο cache μόνο μία τιμή, την τελευταία τιμή).

Εξετάστε τον ακόλουθο κώδικα.

Αυτό θα δημιουργήσει μια τιμή για τον παρατηρητή ότι η ακολουθία επισημαίνεται ως η τελευταία τιμή που δημοσιεύτηκε πριν από την ολοκλήρωση - τιμή 4. Όπως φαίνεται στο παρακάτω σχήμα.



Τι θα συμβεί όμως αν παραλείψουμε την κλήση που επισημαίνει την ακολουθία ως ολοκληρωμένη; Ας σχολιάσουμε τη γραμμή και ας προσπαθήσουμε ξανά.

Αυτό δεν δημιουργεί δεδομένα για τον παρατηρητή, επειδή το AsyncSubject<T> δημοσιεύει αποτελέσματα μόνο αφού η ακολουθία επισημανθεί ως ολοκληρωμένη.



Αυτή είναι μια σημαντική διαφορά που <T>πρέπει να έχει υπόψη του όποιος χρησιμοποιεί το AsyncSubject.

συμπέρασμα

Αυτό το άρθρο δείχνει <T>τις διαφορές μεταξύ των διαφόρων αδελφών του Subject και μερικές από τις παραλλαγές του. Είναι συχνά χρήσιμο να γνωρίζετε αυτές τις λεπτές διαφορές, καθώς μπορεί να παρουσιάσουν διαφορετική συμπεριφορά από ό,τι περιμένατε αν δεν το συνειδητοποιήσετε.

Αρχικός σύνδεσμος:Η σύνδεση με υπερσύνδεσμο είναι ορατή.





Προηγούμενος:Το .NET/C# ελέγχει εάν υπάρχει διαθέσιμη θύρα TCP
Επόμενος:NSIS (1) Δημιουργήστε ένα απλό πρόγραμμα εγκατάστασης
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 27/1/2024 12:19:47 μ.μ. |
Συνδρομή θέματος θέματος για το Angular RxJS
https://www.itsvse.com/thread-9209-1-1.html
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 28/4/2024 11:36:59 π.μ. |
Το ASP.NET Core χρησιμοποιεί το ενδιάμεσο μοντέλο MediatR
https://www.itsvse.com/thread-9272-1-1.html
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com