Προγραμματισμός

Learning SynchronizationContext, async και περιμένετε

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

Η Microsoft παρείχε υποστήριξη για παράλληλο προγραμματισμό στο .Net Framework για να αξιοποιήσει τα οφέλη των συστημάτων πολλαπλών πυρήνων. Μπορείτε να αξιοποιήσετε το ασύγχρονο για να βελτιώσετε την απόδοση και την ανταπόκριση της εφαρμογής σας.

Ουσιαστικά, υπάρχουν δύο πιθανοί τύποι λειτουργιών σε μια εφαρμογή. Σε αυτές περιλαμβάνονται οι λειτουργίες που συνδέονται με υπολογιστές και I / O. Οι υπολογιστικές - δεσμευμένες λειτουργίες είναι εκείνες στις οποίες ο υπολογισμός μπορεί να εκτελεστεί σε ξεχωριστό νήμα έτσι ώστε το κύριο νήμα να μπορεί να συνεχίσει με την εκτέλεση του. Αντιθέτως, οι δεσμευμένες λειτουργίες I / O είναι εκείνες στις οποίες εκτελούνται εξωτερικά και ως εκ τούτου δεν χρειάζεται να μπλοκάρουν το τρέχον νήμα ενώ το I / O βρίσκεται σε εξέλιξη.

Πλαίσιο συγχρονισμού και πλαίσιο εκτέλεσης

Κάθε νήμα έχει ένα περιβάλλον που σχετίζεται με αυτό - αυτό είναι επίσης γνωστό ως το "τρέχον" περιβάλλον - και αυτά τα περιβάλλοντα μπορούν να κοινοποιηθούν σε όλα τα νήματα. Το ExecutionContext περιέχει σχετικά μεταδεδομένα του τρέχοντος περιβάλλοντος ή περιβάλλοντος στο οποίο το πρόγραμμα βρίσκεται σε εκτέλεση. Το SynchronizationContext αντιπροσωπεύει μια αφαίρεση - δηλώνει τη θέση όπου εκτελείται ο κωδικός της εφαρμογής σας.

Το SynchronizationContext σάς επιτρέπει να κάνετε ουρά σε μια εργασία σε άλλο περιβάλλον. Σημειώστε ότι κάθε νήμα μπορεί να έχει το δικό του SynchronizatonContext. Η κλάση SynchronizationContext προστέθηκε πρόσφατα στο System. Περνώντας το χώρο ονομάτων και διευκολύνει την επικοινωνία μεταξύ των νημάτων. Μπορείτε να διαβάσετε περισσότερα για το SynchronizationContext και το ExecutionContext εδώ.

Μια βαθιά βουτιά στο εσωτερικό του Async και του περιμένω

Τα τρία μοτίβα ασύγχρονου προγραμματισμού περιλαμβάνουν τα ακόλουθα:

  1. Ασύγχρονο μοντέλο προγραμματισμού (APM)
  2. Ασύγχρονο μοτίβο βάσει συμβάντων (EAP)
  3. Ασύγχρονο μοτίβο βάσει εργασιών (TAP)

Το πιο πρόσφατο, το συνιστώμενο και το πιο κομψό από όλα αυτά είναι το TAP.

Σημειώστε ότι μπορείτε να επισημάνετε μια μέθοδο χρησιμοποιώντας τη λέξη-κλειδί "async" που επιστρέφει άκυρη, Εργασία ή Εργασία. Σημειώστε ότι όταν εμφανίζεται μια εξαίρεση μέσα σε μια ασύγχρονη μέθοδο που έχει έναν τύπο επιστροφής Task ή Task, οι λεπτομέρειες εξαίρεσης αποθηκεύονται εντός της παρουσίας Task.

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

Όταν χρησιμοποιείτε τη λέξη-κλειδί "περιμένετε" μέσα σε μια ασύγχρονη μέθοδο, η μέθοδος χωρίζεται σε μια μηχανή κατάστασης. Λάβετε υπόψη ότι η λέξη-κλειδί "αναμονή" καταγράφει το τρέχον κείμενο συγχρονισμού και μόλις ολοκληρωθεί η εργασία που αναμενόταν χρησιμοποιώντας τη λέξη-κλειδί "αναμονή", η μηχανή κατάστασης συνεχίζεται και επανεκκίνηση της εκτέλεσης του κώδικα στη μέθοδο καλούντος - αυτό είναι επίσης γνωστή ως συνέχεια. Εάν η εκτέλεση του κώδικα που αναμενόταν χρησιμοποιώντας τη λέξη-κλειδί "αναμονή" έχει ολοκληρωθεί τη στιγμή που αντιμετωπίζεται το σημείο αναστολής, η ασύγχρονη μέθοδος (η μέθοδος που έχει επισημανθεί ως "ασύγχρονος") εκτελείται συγχρονισμένα. Εάν η εκτέλεση του κώδικα που αναμενόταν δεν ολοκληρώθηκε, επισυνάπτεται ένας πληρεξούσιος συνέχισης στον κώδικα που αναμενόταν.

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

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

$config[zx-auto] not found$config[zx-overlay] not found