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

Πώς να δημιουργήσετε τον δικό σας προγραμματιστή εργασιών στο C #

Το TPL (Task Parallel Library) είναι ένα από τα πιο ενδιαφέροντα νέα χαρακτηριστικά στις πρόσφατες εκδόσεις του .NET framework, που παρουσιάστηκε για πρώτη φορά στο .NET Framework 4.0. Για να εργαστείτε με το TPL θα πρέπει να επωφεληθείτε από το χώρο ονομάτων System.Threading.Tasks.

Τι είναι οι προγραμματιστές εργασιών; Γιατί τα χρειαζόμαστε;

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

Το .NET Framework σάς παρέχει δύο προγραμματιστές εργασιών. Αυτά περιλαμβάνουν τον προεπιλεγμένο προγραμματιστή εργασιών που εκτελείται στην ομάδα νήματος πλαισίου .NET και έναν άλλο προγραμματιστή εργασιών που εκτελείται στο πλαίσιο συγχρονισμού ενός καθορισμένου στόχου. Σημειώστε ότι ο προεπιλεγμένος προγραμματιστής εργασιών του TPL εκμεταλλεύεται την ομάδα νημάτων .NET Framework. Αυτό το σύνολο νήματος αντιπροσωπεύεται με τη σειρά του από την κλάση ThreadPool που περιέχεται στο System.Threading.Tasks namespace.

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

Επέκταση της κλάσης TaskScheduler σε C #

Για να δημιουργήσετε το δικό σας προσαρμοσμένο χρονοδιάγραμμα εργασιών, θα πρέπει να δημιουργήσετε μια κλάση που επεκτείνει την κλάση System.Threading.Tasks.TaskScheduler. Έτσι, για να δημιουργήσετε έναν προσαρμοσμένο προγραμματιστή εργασιών, θα πρέπει να επεκτείνετε την αφηρημένη κλάση TaskScheduler και να παρακάμψετε τις ακόλουθες μεθόδους.

  • Το QueueTask επιστρέφει άκυρο και δέχεται ένα αντικείμενο Task ως παράμετρο και αυτή η μέθοδος καλείται όταν πρόκειται να προγραμματιστεί μια εργασία
  • Το GetSchedchedTasks επιστρέφει μια λίστα (ένα IEnumerable to ακριβές) όλων των εργασιών που έχουν προγραμματιστεί
  • Το TryExecuteTaskInline χρησιμοποιείται για την εκτέλεση εργασιών inline, δηλαδή στο τρέχον νήμα. Σε αυτήν την περίπτωση, οι εργασίες εκτελούνται χωρίς την ανάγκη να τα περιμένουν στην ουρά

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να επεκτείνετε την τάξη TaskScheduler για να εφαρμόσετε τον προσαρμοσμένο προγραμματιστή σας στο C #.

δημόσια τάξη CustomTaskScheduler: TaskScheduler, IDisposable

    {

    }

Όπως συζητήσαμε νωρίτερα σε αυτό το άρθρο, θα πρέπει να παρακάμψετε τις μεθόδους GetSchedchedTasks, QueueTask και TryExecuteTaskInline στον προσαρμοσμένο προγραμματιστή εργασιών.

δημόσια σφραγισμένη τάξη CustomTaskScheduler: TaskScheduler, IDisposable

  {

προστατευμένη παράκαμψη IEnumerable GetSchedchedTasks ()

        {

//ΝΑ ΚΑΝΩ

        }

προστατευμένη παράκαμψη void

        {

//ΝΑ ΚΑΝΩ

        }

προστατευμένη παράκαμψη bool TryExecuteTaskInline (Εργασία εργασίας, bool taskWasPre sebelumnyalyQueued)

        {

//ΝΑ ΚΑΝΩ

        }

δημόσιο κενό Απορρίψτε ()

        {

//ΝΑ ΚΑΝΩ

        }

  }

Χρησιμοποιήστε το BlockingCollection για να αποθηκεύσετε μια συλλογή αντικειμένων εργασίας στο C #

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

δημόσια σφραγισμένη τάξη CustomTaskScheduler: TaskScheduler, IDisposable

 {

ιδιωτικό BlockingCollection taskCollection = νέο BlockingCollection ();

ιδιωτικό αναγνωστικό νήμα mainThread = null;

δημόσιο CustomTaskScheduler ()

        {

mainThread = νέο Thread (νέο ThreadStart (Εκτέλεση));

αν (! mainThread.IsAlive)

            {

mainThread.Start ();

            }

        }

ιδιωτικό κενό Εκτέλεση ()

        {

foreach (var task in tasksCollection.GetConsumingEnumerable ())

            {

TryExecuteTask (εργασία);

            }

        } 

// Άλλες μέθοδοι

  }

Ανατρέξτε στον κατασκευαστή της κλάσης CustomTaskScheduler. Σημειώστε πώς έχει δημιουργηθεί ένα νέο νήμα και άρχισε να εκτελεί τη μέθοδο εκτέλεσης.

Εφαρμόστε τις μεθόδους GetSchedchedTasks, QueueTask και TryExecuteTaskInline στο C #

Στη συνέχεια, πρέπει να εφαρμόσουμε τις τρεις μεθόδους που πρέπει να παρακάμψουμε στον προσαρμοσμένο χρονοδιάγραμμα εργασιών. Αυτές οι τρεις μέθοδοι περιλαμβάνουν τα GetSchedchedTasks, QueueTask και TryExecuteTaskInline.

Η μέθοδος GetSchedchedTasks επιστρέφει την παρουσία της συλλογής εργασιών ως IEnumerable. Αυτό χρησιμοποιείται έτσι ώστε να μπορείτε να απαριθμήσετε τη συλλογή όπως φαίνεται στη μέθοδο Εκτέλεση. Η μέθοδος QueueTask δέχεται ένα αντικείμενο Task ως παράμετρο και το αποθηκεύει στη συλλογή εργασιών. Η μέθοδος TryExecuteTaskInline δεν έχει εφαρμογή - θα την αφήσω στον αναγνώστη να την εφαρμόσει.

προστατευμένη παράκαμψη IEnumerable GetSchedchedTasks ()

        {

επιστροφή εργασιώνCollection.ToArray ();

        }

προστατευμένη παράκαμψη void QueueTask (Εργασία εργασίας)

        {

αν (εργασία! = μηδέν)

taskCollection.Add (εργασία);

        }

προστατευμένη παράκαμψη bool TryExecuteTaskInline (Εργασία εργασίας, bool taskWasPre sebelumnyalyQueued)

        {

επιστροφή ψευδής?

        }

Πλήρες παράδειγμα CustomTaskScheduler στο C #

Η ακόλουθη λίστα κωδικών απεικονίζει την τελική έκδοση του CustomTaskScheduler.

δημόσια σφραγισμένη τάξη CustomTaskScheduler: TaskScheduler, IDisposable

    {

ιδιωτικό BlockingCollection taskCollection = νέο BlockingCollection ();

ιδιωτικό αναγνωστικό νήμα mainThread = null;

δημόσιο CustomTaskScheduler ()

        {

mainThread = νέο Thread (νέο ThreadStart (Εκτέλεση));

αν (! mainThread.IsAlive)

            {

mainThread.Start ();

            }

        }

ιδιωτικό κενό Εκτέλεση ()

        {

foreach (var task in tasksCollection.GetConsumingEnumerable ())

            {

TryExecuteTask (εργασία);

            }

        }

προστατευμένη παράκαμψη IEnumerable GetSchedchedTasks ()

        {

επιστροφή εργασιώνCollection.ToArray ();

        }

προστατευμένη παράκαμψη void

        {

αν (εργασία! = μηδέν)

taskCollection.Add (εργασία);

        }

προστατευμένη παράκαμψη bool TryExecuteTaskInline (Εργασία εργασίας, bool taskWasPre sebelumnyalyQueued)

        {

επιστροφή ψευδής?

        }

απόρριψη ιδιωτικού κενού (διάθεση bool)

        {

εάν (! διαθέτετε) επιστροφή ·

taskCollection.CompleteAdding ();

taskCollection.Dispose ();

        }

δημόσιο κενό Απορρίψτε ()

        {

Απορρίψτε (true)

GC.SuppressFinalize (αυτό);

        }

    }

Για να χρησιμοποιήσετε τον προσαρμοσμένο προγραμματιστή εργασιών που μόλις εφαρμόσαμε, μπορείτε να χρησιμοποιήσετε το ακόλουθο απόσπασμα κώδικα:

CustomTaskScheduler taskScheduler = νέο CustomTaskScheduler ();

Task.Factory.StartNew (() => SomeMethod (), CancellationToken.None, TaskCreationOptions.None, taskScheduler);

Πώς να κάνετε περισσότερα στο C #:

  • Πότε να χρησιμοποιήσετε μια αφηρημένη τάξη εναντίον διεπαφής στο C #
  • Πώς να εργαστείτε με το AutoMapper στο C #
  • Πώς να χρησιμοποιήσετε τις εκφράσεις λάμδα στο C #
  • Πώς να συνεργαστείτε με τους αντιπροσώπους Action, Func και Predicate στο C #
  • Πώς να συνεργαστείτε με εκπροσώπους στο C #
  • Πώς να εφαρμόσετε έναν απλό καταγραφέα στο C #
  • Πώς να εργαστείτε με χαρακτηριστικά στο C #
  • Πώς να εργαστείτε με το log4net στο C #
  • Πώς να εφαρμόσετε το μοτίβο σχεδίασης αποθετηρίου στο C #
  • Πώς να εργαστείτε με προβληματισμό στο C #
  • Πώς να εργαστείτε με το σύστημα παρακολούθησης αρχείων στο C #
  • Πώς να εκτελέσετε τεμπέλης αρχικοποίηση στο C #
  • Πώς να εργαστείτε με MSM στο C #
  • Πώς να εργαστείτε με μεθόδους επέκτασης στο C #
  • Πώς να μας εκφράσεις λάμδα στο C #
  • Πότε να χρησιμοποιήσετε την ευμετάβλητη λέξη-κλειδί στο C #
  • Πώς να χρησιμοποιήσετε τη λέξη-κλειδί απόδοσης στο C #
  • Πώς να εφαρμόσετε τον πολυμορφισμό στο C #
  • Πώς να δημιουργήσετε τον δικό σας προγραμματιστή εργασιών στο C #
  • Πώς να εργαστείτε με το RabbitM στο C #
  • Πώς να εργαστείτε με μια πλειάδα στο C #
  • Εξερεύνηση εικονικών και αφηρημένων μεθόδων στο C #