Οι συλλογές που εισάγονται στο .NET Framework 1.0 βρίσκονται στο χώρο ονομάτων System.Collections. Αυτές οι συλλογές, συμπεριλαμβανομένων των συνήθως χρησιμοποιούμενων ArrayList και Hashtable, παρέχουν κάποιο είδος ασφάλειας νήματος μέσω της ιδιότητας Synchronized, η οποία επιστρέφει ένα περιτύλιγμα ασφαλές για νήματα που σχετίζεται με τη συλλογή. Το περιτύλιγμα λειτουργεί κλειδώνοντας ολόκληρο το σετ για κάθε λειτουργία προσθήκης ή αφαίρεσης. Επομένως, κάθε νήμα που προσπαθεί να αποκτήσει πρόσβαση στη συλλογή πρέπει να περιμένει μέχρι να έρθει η σειρά του να αποκτήσει την κλειδαριά. Αυτό δεν είναι επεκτάσιμο και θα οδηγήσει σε σημαντική υποβάθμιση της απόδοσης για μεγάλες συλλογές. Επιπλέον, αυτός ο σχεδιασμός δεν αποτρέπει εντελώς τη διαμάχη. Για περισσότερες πληροφορίες, ανατρέξτε στην ακόλουθη σελίδα στην τοποθεσία Web του MSDN: Συγχρονισμός σε γενικές συλλογές
Η κλάση συλλογής που εισήχθη στο .NET Framework 2.0 βρίσκεται στον χώρο ονομάτων System.Collections.Generic. Αυτές οι κατηγορίες συλλογής περιλαμβάνουν List<T>, Dictionary< TKey, TValue> κ.λπ. Αυτές οι παρέχουν ασφάλεια και απόδοση υψηλότερου τύπου σε σύγκριση με τις .NET Framework 1.0. Ωστόσο, η κλάση συλλογής .NET Framework 2.0 δεν παρέχει συγχρονισμό νημάτων. Κατά την προσθήκη ή την κατάργηση στοιχείων σε πολλά νήματα ταυτόχρονα, ο κωδικός χρήστη πρέπει να παρέχει όλο το συγχρονισμό.
Συνιστάται να χρησιμοποιείτε ταυτόχρονες συλλογής στο .NET Framework 4, επειδή παρέχουν όχι μόνο την ασφάλεια τύπου των κλάσεων συλλογής .NET Framework 2.0, αλλά και πιο αποτελεσματική και ολοκληρωμένη ασφάλεια νημάτων από την ασφάλεια νημάτων που παρέχεται από τη συλλογή .NET Framework 1.0.
Ορισμένοι τύποι ταυτόχρονης συλλογής χρησιμοποιούν ελαφρούς μηχανισμούς συγχρονισμού όπως SpinLock, SpinWait, SemaphoreSlim και CountdownEvent, οι οποίοι είναι νέοι στο .NET Framework 4. Συνήθως, οι παραπάνω τύποι συγχρονισμού χρησιμοποιούν "απασχολημένη περιστροφή" για σύντομο χρονικό διάστημα πριν θέσουν το νήμα στην πραγματική κατάσταση αναμονής. Εάν ο χρόνος αναμονής αναμένεται να είναι πολύ σύντομος, η περιστροφή θα καταναλώσει πολύ λιγότερους υπολογιστικούς πόρους από την αναμονή, η οποία περιλαμβάνει μετατροπές πυρήνα που θα καταναλώσουν πολλούς πόρους. Για συλλογής που χρησιμοποιούν περιστροφή, αυτή η αποτελεσματικότητα σημαίνει ότι πολλά νήματα μπορούν να προσθέτουν και να αφαιρούν στοιχεία με πολύ γρήγορο ρυθμό. Για περισσότερες πληροφορίες σχετικά με τον περιορισμό και τον αποκλεισμό, ανατρέξτε στην ενότητα SpinLock και SpinWait. Οι ConcurrentQueue<T> και ConcurrentStack<T> δεν χρησιμοποιούν καθόλου κλειδώματα. Αντίθετα, βασίζονται σε αλληλένδετες λειτουργίες για την ασφάλεια του νήματος.
διευκρινίζω
Επειδή οι ταυτόχρονες συλλογής υποστηρίζουν το ICollection, παρέχουν υλοποιήσεις για τις ιδιότητες IsSynchronized και SyncRoot, ακόμα και αν δεν σχετίζονται. Το IsSynchronized επιστρέφει πάντα false, ενώ το SyncRoot είναι πάντα null (Τίποτα στη Visual Basic).
Ο παρακάτω πίνακας παραθέτει τους τύπους συλλογής στο χώρο ονομάτων System.Collections.Concurrent.
δακτυλογραφώ | περιγραφή | ΑποκλεισμόςΣυλλογής<T> | Παρέχει<T> κάθε τύπο περιορισμού και αποκλεισμού για την υλοποίηση του IProducerConsumerCollection. Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα Επισκόπηση BlockingCollection. | ConcurrentDictionary<TKey, TValue> | Το κλειδί/τιμή είναι η ασφαλής εφαρμογή του λεξικού για νήματα. | Ταυτόχρονη ουρά<T> | Εφαρμογή ασφάλειας νήματος ουρών FIFO (first in, first out). | Ταυτόχρονη στοίβα<T> | Ασφαλής υλοποίηση των στοίβων LIFO (last-in, first-out). | Ταυτόχρονη τσάντα<T> | Ασφαλής υλοποίηση νήματος μιας συλλογής στοιχείων εκτός σειράς. | IProducerConsumerCollection<T> | Οι τύποι πρέπει να εφαρμόζονται σεΑποκλεισμόςΣυλλογήςδιεπαφές που χρησιμοποιούνται στην
|
|