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

Πώς να εργαστείτε με νήματα στο C #

Ένα νήμα είναι η μικρότερη μονάδα εκτέλεσης σε μια διαδικασία. Το Multithreading είναι η δυνατότητα να έχετε πολλά νήματα στη μνήμη σε μια δεδομένη στιγμή και να εναλλάσσετε μεταξύ τους για να χειριστείτε πολλές λειτουργίες ταυτόχρονα. Το Microsoft .Net Framework παρέχει εξαιρετική υποστήριξη για εργασία με θέματα.

Νήματα προγραμματισμού σε C #

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

 Thread t = νέο Thread (νέο ThreadStart (MyThreadMethod)); 

Για να ξεκινήσετε το νέο νήμα, θα πρέπει να καλέσετε τη μέθοδο Έναρξη στο αντικείμενο νήματος που έχετε δημιουργήσει. Η ακόλουθη λίστα κωδικών το δείχνει αυτό. Σημειώστε ότι η μέθοδος νήματος MyThreadMethod εκτελείται στο νέο νήμα (που ονομάζεται εργαζόμενο νήμα) που έχει δημιουργηθεί.

 στατικό κενό Κεντρικό ()

        {

Thread t = νέο Thread (νέο ThreadStart (MyThreadMethod));

t. Έναρξη ();

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

        }

στατικό κενό MyThreadMethod ()

        {

Console.WriteLine ("Γεια σου Κόσμος!");

        }

Εμφάνιση καταστάσεων νημάτων σε C #

Ένα νήμα στη μνήμη μπορεί να βρίσκεται σε διαφορετικές καταστάσεις - Ματαιωμένο, Φόντο, Τρέξιμο, Διακοπή, Σε αναστολή, Μη ξεκίνημα, κ.λπ. Οι καταστάσεις νημάτων ορίζονται στην απαρίθμηση ThreadState που είναι διαθέσιμη στο Σύστημα. Εκτός εάν καλείται η μέθοδος Έναρξη σε ένα νήμα, το νήμα βρίσκεται στην κατάσταση Μη Έναρξη. Όταν καλείται η μέθοδος Έναρξη στην παρουσία νήματος, η κατάσταση του νήματος αλλάζει από Unstarted σε Running.

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

 Thread t = νέο Thread (νέο ThreadStart (MyThreadMethod));

t. Έναρξη ();

Console.WriteLine ("Η κατάσταση του νήματος είναι:" + t.ThreadState.ToString ());

Έλεγχος νημάτων προσκηνίου και φόντου στο C #

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

Μπορείτε να ορίσετε την κατάσταση φόντου ενός νήματος χρησιμοποιώντας την ιδιότητα IsBackground. Εδώ είναι ένα παράδειγμα κώδικα που δείχνει πώς μπορεί να επιτευχθεί αυτό.

 στατικό κενό Κεντρικό ()

        {

Thread t = νέο Thread (νέο ThreadStart (MyThreadMethod));

t. Έναρξη ();

t.IsBackground = true;

Console.WriteLine ("Η κατάσταση φόντου του νήματος είναι:" + t.IsBackground.ToString ());

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

        }

Μπορείτε να αναστείλετε ή να συνεχίσετε ένα νήμα επικαλούμενοι τις μεθόδους Αναστολής () και Συνέχιση () στο αντικείμενο του νήματος. Λάβετε υπόψη ότι μπορείτε να συνεχίσετε μόνο ένα νήμα που είχατε προηγουμένως αναστείλει κάνοντας μια κλήση στη μέθοδο Αναστολής ().

 Thread t = νέο Thread (νέο ThreadStart (MyThreadMethod));

t. Έναρξη ();

t. Αναστολή (); // Αναστέλλει το νέο νήμα

t. Συνέχιση (); // Συνεχίζει το νήμα που έχει τεθεί σε αναστολή

Ωστόσο, πρέπει να σημειωθεί ότι οι μέθοδοι Thread.Suspend () και Thread.Resume () έχουν καταργηθεί. Αντίθετα, πρέπει να χρησιμοποιήσετε τις μεθόδους AutoResetEvent και EventWaitHandle για να συγχρονίσετε δραστηριότητες που περιλαμβάνουν νήματα.

Ορισμός προτεραιότητας νήματος σε C #

Μπορείτε να ελέγξετε την προτεραιότητα ενός νήματος για να προσδιορίσετε το σχετικό μερίδιο του χρόνου επεξεργαστή που θα πάρει ένα νήμα σε σύγκριση με τα άλλα νήματα που βρίσκονται στη μνήμη. Η προτεραιότητα νήματος ορίζεται στην απαρίθμηση ThreadPriority. Οι πιθανές τιμές περιλαμβάνουν: Χαμηλότερη, Κάτω Κανονική, Κανονική, Πάνω από Κανονική και Υψηλότερη. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να ορίσετε τις προτεραιότητες νήματος δύο νημάτων χρησιμοποιώντας την ιδιότητα Priority του αντικειμένου νήματος.

 στατικό κενό Κεντρικό ()

        {

Νήμα νήματος 1 = νέο νήμα (νέο ThreadStart (Μέθοδος 1));

Νήμα νήματος 2 = νέο νήμα (νέο ThreadStart (Μέθοδος 2));

νήμα1.Priority = ThreadPriority.Highest;

νήμα2.Priority = ThreadPriority.Lowest;

νήμα 2. Έναρξη ();

νήμα 1. Έναρξη ();

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

        }

στατικό κενό Μέθοδος 1 ()

        {

για (int i = 0; i <10; i ++)

            {

Console.WriteLine ("Πρώτο νήμα:" + i);

            }

        }

στατικό κενό Μέθοδος 2 ()

        {

για (int i = 0; i <10; i ++)

            {

Console.WriteLine ("Δεύτερο νήμα:" + i);

            }

        }

Όταν εκτελείτε το παραπάνω απόσπασμα κώδικα, θα δείτε ότι το πρώτο νήμα ολοκληρώνει την εκτέλεση του πριν από το δεύτερο νήμα παρόλο που το δεύτερο νήμα ξεκίνησε πριν από το πρώτο νήμα στη μέθοδο Main.

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