Async/Await vs Threads

Async/Await vs Threads

Όχι. Ένα νήμα μπορεί να κάνει πολλά περισσότερα χρήσιμα πράγματα. Το Await έχει σχεδιαστεί ειδικά για να αντιμετωπίζει κάτι απαιτούν χρόνο, συνήθως ένα αίτημα I/O. Κάτι που παραδοσιακά γινόταν με επανάκληση όταν ολοκληρώθηκε το αίτημα I/O. Η σύνταξη κώδικα που βασίζεται σε αυτές τις επανακλήσεις είναι αρκετά δύσκολη, η αναμονή την απλοποιεί πολύ.

Χονδρικά. Το Wait φροντίζει απλώς να αντιμετωπίσει την καθυστέρηση, διαφορετικά δεν κάνει τίποτα από αυτό που κάνει ένα νήμα. Η έκφραση αναμονής , αυτό που βρίσκεται στα δεξιά της λέξης-κλειδιού αναμονής, είναι αυτό που κάνει τη δουλειά. Στην ιδανική περίπτωση, δεν χρησιμοποιεί καθόλου νήμα, δημοσιεύει ένα αίτημα προγράμματος οδήγησης και μόλις το πρόγραμμα οδήγησης ολοκληρώσει τη μεταφορά δεδομένων, δημιουργεί μια επιστροφή κλήσης ειδοποίησης ολοκλήρωσης. Η δικτύωση είναι μακράν η πιο κοινή χρήση, οι καθυστερήσεις εκατοντάδων χιλιοστών του δευτερολέπτου είναι κοινές και μια αναπόφευκτη παρενέργεια των υπηρεσιών που μετακινούνται από την επιφάνεια εργασίας ή ένα LAN στο "σύννεφο". Η σύγχρονη χρήση τέτοιων υπηρεσιών θα έκανε μια διεπαφή χρήστη να μην ανταποκρίνεται αρκετά.

Όχι. Μπορείτε να το χρησιμοποιήσετε με οποιαδήποτε μέθοδο που επιστρέφει μια Εργασία. Οι μέθοδοι XxxxAsync() είναι απλώς προμαγειρεμένες στο πλαίσιο .NET για κοινές λειτουργίες που απαιτούν χρόνο. Όπως η λήψη δεδομένων από έναν διακομιστή ιστού.


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


Το σκέφτομαι με αυτόν τον τρόπο (και νομίζω ότι το κάνει και η Microsoft αν κοιτάξετε τη διεύθυνση https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110 )#threads)

Το Async/wait είναι ένας γρήγορος τρόπος εκτέλεσης κάποιου κώδικα στο κύριο νήμα της εφαρμογής με το πλεονέκτημα ότι ο κώδικας μπορεί να αναστείλει μόνος του όταν δεν έχει δουλειά να κάνει και να επιστρέψει την εστίαση στο κύριο νήμα, να "ξυπνήσει" στο κύριο νήμα όταν υπάρχει είναι ένα αποτέλεσμα που πρέπει να ληφθεί και στη συνέχεια περάστε την επεξεργασία πίσω στο - το μαντέψατε - το κύριο νήμα. Σκεφτείτε το σαν μια δήλωση GOTO με βάση συμβάντα στο Basic που μπορεί να περάσει τον έλεγχο πέρα ​​δώθε σε μια συγκεκριμένη γραμμή εκτέλεσης.

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

Εάν έχετε μια εφαρμογή GUI που πρόκειται να κατεβάσει ένα μεμονωμένο αρχείο και στη συνέχεια να κάνει κάτι με αυτό το αρχείο κατά τη λήψη του - θα το εφαρμόσω χρησιμοποιώντας μια μέθοδο async/wait.

Ωστόσο, εάν το γραφικό περιβάλλον σας χρειάζεται να κατεβάσει 5000 αρχεία - θα δημιουργούσα ένα νήμα λήψης αρχείων για να το χειριστώ, καθώς το κύριο νήμα του GUI μπορεί να παγώσει ενώ η εκτέλεση μεταφέρεται για να χειριστεί τη λήψη των αρχείων.