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

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

[Επικοινωνία] [Μετάφραση]. NET για να χρησιμοποιήσετε τη διαφορά μεταξύ ValueTask και Task

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 2022-3-17 11:21:50 | | | |


Η χρήση κλάσεων Task ή Task έχει ένα σημείο συμφόρησης απόδοσης που δεν αναφέραμε σε προηγούμενα άρθρα. Εν ολίγοις, αυτές οι τάξεις προηγούνται όταν τα αποτελέσματα είναι άμεσα διαθέσιμαΠεριττή κατανομή。 Αυτό σημαίνει ότι ένα νέο αντικείμενο εργασίας ή εργασίας θα δημιουργείται πάντα, ακόμη και αν το αποτέλεσμα είναι ήδη διαθέσιμο. Τώρα, αναφέραμε ότι η έννοια async/await που χρησιμοποιήσαμε σε προηγούμενα άρθρα υπάρχει από την κυκλοφορία του .NET 4.5. Αυτή η δυνατότητα έχει βελτιωθεί από το C# 7 με την έκδοση .NET 4.7 με τη δομή ValueTask που μπορεί να χρησιμοποιηθεί ως επιστροφή για ασύγχρονες λειτουργίες.

Δομή ValueTask


Η δομή ValueTask εμφανίστηκε για πρώτη φορά στο αποθετήριο corefxlab το 2015. Αυτό το αποθετήριο χρησιμοποιείται για τον πειραματισμό και την εξερεύνηση νέων ιδεών που μπορεί να φτάσουν ή να μην φτάσουν στο κύριο αποθετήριο corefx. Το αποθετήριο Corefx είναι το αποθετήριο όπου βρίσκονται όλες οι βασικές βιβλιοθήκες .NET Core. Αναπτύχθηκε και προτάθηκε από τον Stephen Taub για τη βιβλιοθήκη System.Threading.Tasks.Channels. Εκείνη την εποχή, ο Stephen έδωσε μια σύντομη εξήγηση:

Διεύθυνση βιβλιοθήκης CoreFXLab:Η σύνδεση με υπερσύνδεσμο είναι ορατή.


Ένα ValueTask είναι μια ξεχωριστή ένωση ενός T και μιας εργασίας, που επιτρέπει στο ReadAsync να εκχωρεί ελεύθερα για να επιστρέφει συγχρονισμένα τις διαθέσιμες τιμές T (σε αντίθεση με τη χρήση του Task.FromResult, το οποίο απαιτεί εκχώρηση μιας παρουσίας εργασίας). Το ValueTask είναι αναμενόμενο, επομένως η κατανάλωση των περισσότερων παρουσιών δεν διακρίνεται από την κατανάλωση εργασιών.
Πολλοί άνθρωποι βλέπουν τα οφέλη από τη χρήση αυτής της δομής, η οποία περιλαμβάνεται στο C# 7 ως μέρος του πακέτου System.Threading.Tasks.Extensions NuGet. Έτσι, προτού βουτήξουμε στη δομή ValueTask, ας εξετάσουμε το πρόβλημα που χρησιμοποιεί για να λύσει. Δεδομένου ότι το Task(Task) είναι ένας τύπος αναφοράς, ξεκινήστε μεΗ ασύγχρονη μέθοδος που επιστρέφει το αντικείμενο Task σημαίνει ότι εκχωρείται στο σωρό κάθε φορά。 Αυτό είναι απαραίτητο σε πολλές περιπτώσεις.

Ωστόσο, σε ορισμένες περιπτώσεις, οι ασύγχρονες μέθοδοι επιστρέφουν αποτελέσματα αμέσως ή ολοκληρώνονται συγχρονισμένα. Σε αυτές τις περιπτώσεις, αυτή η εκχώρηση είναι περιττή και μπορεί να γίνει δαπανηρή σε κρίσιμα για την απόδοση μέρη του κώδικα. Μέχρι την έκδοση .NET 4.7, δεν υπήρχε τρόπος να αποφευχθεί αυτό, καθώς οι ασύγχρονες μέθοδοι έπρεπε να επιστρέψουν Task, Task <T>ή void (το τελευταίο ήταν συνήθως ανεπιθύμητο). Σε αυτήν την έκδοση του .NET, αυτό επεκτείνεται, πράγμα που σημαίνει ότι μια ασύγχρονη μέθοδος μπορεί να επιστρέψει οποιονδήποτε τύπο, αρκεί να έχει προσβάσιμη μέθοδο GetAwaiter. Το ValueTask είναι ένα συγκεκριμένο παράδειγμα αυτού του τύπου και προστέθηκε επίσης σε αυτήν την έκδοση.

Μπορείτε να περιηγηθείτε στο αποθετήριο corefx και να δείτε την πλήρη εφαρμογή του ValueTask, εδώ είναι η ενότητα API που μας ενδιαφέρει:



Ως δομή, το ValueTask επιτρέπει τη σύνταξη ασύγχρονων μεθόδων που δεν εκχωρούν μνήμη κατά τη διάρκεια του σύγχρονου χρόνου εκτέλεσης. Η συνέπεια API της έννοιας ασυγχρονισμού/αναμονής δεν διακυβεύεται με αυτόν τον τρόπο. Επιπλέον, αυτή η δομή περιμένει από μόνη της, καθιστώντας την εύκολη στη χρήση. Για παράδειγμα, αν εκτελέσουμε αυτόν τον απλό κώδικα:

Στη μέθοδο MultiplyAsync, προσομοιώνουμε μια κατάσταση όπου θέλουμε να αποφύγουμε τη χρήση του Task και να επιστρέψουμε μόνο έναν απλό ακέραιο. Αυτό γίνεται στη δήλωση if της μεθόδου, όπου βασικά ελέγχουμε αν η παράμετρος που πέρασε είναι μηδέν. Το πρόβλημα είναι ότιΑκόμα κι αν η συνθήκη μας στη δήλωση if είναι αληθής, ο παραπάνω κώδικας δημιουργεί ένα αντικείμενο Task。 Επιλύουμε αυτό το πρόβλημα ως εξής:

ValueTask και Task



Όπως αναφέρθηκε προηγουμένως, υπάρχουν δύο κύρια οφέλη από τη χρήση του ValueTask:

  • Βελτιώσεις απόδοσης
  • Αυξήστε την ευελιξία υλοποίησης


Λοιπόν, ποιοι είναι οι αριθμοί πίσω από τις βελτιώσεις απόδοσης; Προσέξτε αυτόν τον κώδικα:


Εάν εκτελέσουμε αυτόν τον κώδικα, χρειάζονται 120ns για να εκτελέσουμε το JIT. Τώρα, αν αντικαταστήσουμε το Task με το ValueTask ως εξής:

Με το JIT, θα έχουμε χρόνο εκτέλεσης 65 ns. Τώρα, είναι αλήθεια ότι λόγω του Task.Delay δεν εκτελούμε συγχρονισμένα, αλλά βλέπουμε βελτίωση στον χρόνο εκτέλεσης.

Ένα άλλο πλεονέκτημα που αναφέραμε είναι η αυξημένη ευελιξία στην εφαρμογή. Τώρα, τι ακριβώς σημαίνει αυτό; Λοιπόν, οι υλοποιήσεις ασύγχρονων διεπαφών που πρέπει να συγχρονιστούν θα αναγκαστούν να χρησιμοποιήσουν το Task.Run ή το Task.FromResult. Φυσικά, αυτό οδηγεί στα ζητήματα απόδοσης που συζητήσαμε νωρίτερα. Όταν χρησιμοποιούμε το ValueTask, είναι πιο πιθανό να επιλέξουμε μεταξύ σύγχρονων ή ασύγχρονων υλοποιήσεων. Λάβετε υπόψη ότι αυτό θα μπορούσε να είναι ένα σημάδι ότι ο κώδικάς σας μπορεί να μην είναι καλά σχεδιασμένος εάν συμβεί αυτό σε εσάς.

Για παράδειγμα, παρατηρήστε αυτήν τη διεπαφή:


Ας υποθέσουμε ότι θέλετε να το καλέσετε από κώδικα ως εξής:

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

Ακολουθεί μια ασύγχρονη υλοποίηση της ίδιας διεπαφής:

Ωστόσο, πρέπει να εξετάσουμε ορισμένους συμβιβασμούς πριν χρησιμοποιήσουμε το ValueTask. Είναι εύκολο να σκεφτεί κανείς ότι το ValueTask θα πρέπει να χρησιμοποιείται από προεπιλογή αντί για το Task, κάτι που σίγουρα δεν ισχύει. Για παράδειγμα, αν και το ValueTask μας βοηθά να αποφύγουμε περιττές αναθέσεις όταν είναι διαθέσιμος ο συγχρονισμός αποτελεσμάτων, περιέχει επίσης δύο πεδία.

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

Αυτός είναι ο λόγος για τον οποίο οι άνθρωποι της Microsoft συνιστούν πραγματικά τη χρήση του Task ή του Task ως προεπιλεγμένου τύπου επιστροφής για ασύγχρονες μεθόδους. Μόνο μετά την ανάλυση απόδοσης θα πρέπει να εξετάσετε το ενδεχόμενο μετάβασης στο ValueTask.


περίληψη

Το ValueTask είναι μια δομή που εισήχθη στο .NET 4.7 και μας δίνει πολλές δυνατότητες να χρησιμοποιήσουμε ασύγχρονες μεθόδους στο .NET. Ωστόσο, δεν είναι χωρίς τίμημα. Αυτό είναι χρήσιμο για μεθόδους κρίσιμης σημασίας για την απόδοση που εκτελούνται συγχρονισμένα. Με αυτά μπορούμε να αποφύγουμε την ανάθεση περιττών αντικειμένων. Ωστόσο, ως τύπος αξίας, συνοδεύεται από όλα τα προβλήματα που έχουν συνήθως οι τύποι τιμών. Επομένως, μπορούμε να επωφεληθούμε από αυτή τη δομή, αλλά πρέπει να είμαστε προσεκτικοί.

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




Προηγούμενος:【Πρακτική δράση】Χρησιμοποιήστε το Docker για να δημιουργήσετε έναν διακομιστή VPN IPsec
Επόμενος:Χρησιμοποιήστε το OpenConnect αντί για το Cisco AnyConnect για να αποφύγετε τη δρομολόγηση κλειδαριών τραπεζιού
Δημοσιεύτηκε στις 2022-3-18 22:21:57 |
Ελάτε να μάθετε ξανά.
Δημοσιεύτηκε στις 2022-3-22 14:05:53 |
Μάθετε την ουσία της μάθησηςΌχι άσχημα
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com