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

Εργασία με ασφαλείς συλλογές νήματος: ConcurrentStack και ConcurrentQueue

Οι συλλογές ασφαλών νημάτων παρουσιάστηκαν για πρώτη φορά στο .Net 4 με την εισαγωγή του System.Collections.Current namespace. Οι τύποι συλλογής στο System.Collections.Currurrent namespace περιέχει μια συλλογή κλάσεων ασφαλούς νήματος.

Ταυτόχρονη στοίβα

Μια στοίβα είναι μια δομή δεδομένων που λειτουργεί σε βάση LIFO (τελευταία στην πρώτη έξοδο). Η κατηγορία ConcurrentStack είναι ένα ασφαλές νήμα αντίστοιχο της γενικής κατηγορίας Stack. Το ConcurrentStack είναι μια κλάση γενικής συλλογής ασφαλούς νήματος που παρουσιάστηκε για πρώτη φορά ως μέρος του .Net Framework 4. Ακολουθεί η λίστα των σημαντικών μεθόδων αυτής της κλάσης που απεικονίζουν τις πιθανές λειτουργίες.

  1. Push (στοιχείο T) - αυτή η μέθοδος χρησιμοποιείται για την προσθήκη δεδομένων τύπου Τ.
  2. PushRange - αυτή η μέθοδος μπορεί να χρησιμοποιηθεί για την προσθήκη μιας σειράς στοιχείων του τύπου T.
  3. TryPop (out T) - αυτή η μέθοδος χρησιμοποιείται για την ανάκτηση του πρώτου στοιχείου από τη στοίβα. Επιστρέφει αληθινά στην επιτυχία, ψευδώς διαφορετικά.
  4. TryPeek (out T) - αυτή η μέθοδος χρησιμοποιείται για την ανάκτηση του επόμενου στοιχείου από τη στοίβα, αλλά δεν αφαιρεί το στοιχείο από τη στοίβα. Σημειώστε ότι παρόμοια με τη μέθοδο TryPop (out T), επιστρέφει αληθινά στην επιτυχία και ψευδώς διαφορετικά.
  5. TryPopRange - αυτή η μέθοδος είναι υπερφορτωμένη και λειτουργεί παρόμοια με το TryPop αλλά χρησιμοποιείται για την ανάκτηση συστοιχιών από τη στοίβα

Δείτε πώς μπορείτε να δημιουργήσετε μια παρουσία της κλάσης ConcurrentStack και να προωθήσετε δεδομένα σε αυτήν.

ConcurrentStack concurrentStack = νέο ConcurrentStack ();

για (Int32 index = 0; index <10; index ++)

{

concurrentStack.Push (ευρετήριο);

}

Για να ανακτήσετε τα στοιχεία από μια ταυτόχρονη στοίβα, μπορείτε να αξιοποιήσετε τη μέθοδο TryPop (out T) όπως φαίνεται παρακάτω.

Δεδομένα Int32;

bool success = concurrentStack.TryPop (δεδομένα εκτός);

Η ακόλουθη λίστα κώδικα δείχνει πώς μπορείτε να αποθηκεύσετε και να ανακτήσετε δεδομένα από και προς μια ταυτόχρονη στοίβα.

static void Main (συμβολοσειρά [] args)

       {

ConcurrentStack concurrentStack = νέο ConcurrentStack ();

για (Int32 index = 0; index <100; index ++)

           {

concurrentStack.Push (ευρετήριο);

           }

ενώ (concurrentStack.Count> 0)

           {

Δεδομένα Int32;

bool success = concurrentStack.TryPop (δεδομένα εκτός);

εάν (επιτυχία)

              {

Console.WriteLine (δεδομένα);

               }

           }

Κονσόλα. Διαβάστε ();

       }

Όταν εκτελείτε την παραπάνω λίστα κωδικών, οι αριθμοί 0 έως 99 θα εμφανίζονται με την αντίστροφη σειρά στο παράθυρο της κονσόλας.

Ταυτόχρονη ουρά

Η ουρά είναι μια δομή δεδομένων που λειτουργεί με βάση το FIFO (πρώτη στην πρώτη έξοδο). Η κλάση ConcurrentQueue στο .Net λειτουργεί ως γενική ουρά βασισμένη σε FIFO νήμα.

Ακολουθεί η λίστα των σημαντικών μεθόδων στην κλάση ConcurrentQueue.

  1. Enqueue (στοιχείο T) - αυτή η μέθοδος χρησιμοποιείται για την προσθήκη ενός στοιχείου τύπου T στην ουρά
  2. TryPeek (out T) - αυτή η μέθοδος χρησιμοποιείται για την ανάκτηση του επόμενου στοιχείου από την ουρά, αλλά δεν αφαιρεί το στοιχείο από την ουρά. Αυτή η μέθοδος επιστρέφει true στην επιτυχία και false όταν αποτυγχάνει.
  3. TryDequeue (out T) - αυτή η μέθοδος χρησιμοποιείται για την ανάκτηση του πρώτου στοιχείου από την ουρά. Σε αντίθεση με τη μέθοδο TryPeek (out T), αφαιρεί το στοιχείο από την ουρά. Αυτή η μέθοδος επιστρέφει αληθινή στην επιτυχία και ψευδώς διαφορετικά.

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να δημιουργήσετε μια παρουσία της κλάσης ConcurrentQueue για την αποθήκευση ακέραιων αριθμών.

ConcurrentQueue concurrentQueue = νέο ConcurrentQueue ();

Για να αποθηκεύσετε στοιχεία στην παράλληλη ουρά, μπορείτε να επωφεληθείτε από τη μέθοδο Enqueue όπως φαίνεται παρακάτω.

concurrentQueue.Enqueue (100);

Η ακόλουθη λίστα κωδικών δείχνει πώς μπορείτε να αποθηκεύσετε και να ανακτήσετε στοιχεία από και προς την ταυτόχρονη ουρά.

ConcurrentQueue concurrentQueue = νέο ConcurrentQueue ();

για (int index = 0; index <100; index ++)

{

concurrentQueue.Enqueue (ευρετήριο);

}

Στοιχείο Int32;

ενώ (concurrentQueue.TryDequeue (στοιχείο εκτός))

{

Console.WriteLine (στοιχείο);

}

Όταν εκτελείτε την παραπάνω λίστα κωδικών, οι αριθμοί 0 έως 99 θα εμφανίζονται στο παράθυρο της κονσόλας.

Σημειώστε ότι τόσο οι κλάσεις ConcurrentStack όσο και ConcurrentQueue είναι ασφαλείς για νήματα και μπορούν να διαχειριστούν εσωτερικά ζητήματα κλειδώματος και συγχρονισμού.

Μπορείτε επίσης να μετατρέψετε την ταυτόχρονη εμφάνιση ουράς σε πίνακα κάνοντας μια κλήση στη μέθοδο ToArray (). Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορεί να επιτευχθεί αυτό.

ConcurrentQueue concurrentQueue = νέο ConcurrentQueue ();

για (Int32 index = 0; index <100; index ++)

concurrentQueue.Enqueue (ευρετήριο);

Int32 [] integerArray = concurrentQueue.ToArray ();

foreach (int i in integerArray)

{

Console.WriteLine (i);

}

Η ιδιότητα IsEmpty της κλάσης ConcurrentQueue επιστρέφει true είναι η συλλογή είναι κενή, ψευδώς διαφορετικά. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτήν τη μέθοδο.

ConcurrentQueue concurrentQueue = νέο ConcurrentQueue ();

για (ευρετήριο Int32 = 0; ευρετήριο <100; ευρετήριο ++)

concurrentQueue.Enqueue (ευρετήριο);

ενώ (! concurrentQueue.IsEmpty)

{

Αποτέλεσμα Int32;

concurrentQueue.TryDequeue (αποτέλεσμα έξω);

Console.WriteLine (αποτέλεσμα);

}