Programmēšana

Kā izveidot savu uzdevumu plānotāju C #

TPL (Task Parallel Library) ir viena no interesantākajām jaunākajām funkcijām jaunākajās .NET Framework versijās, kas pirmo reizi tika ieviesta .NET Framework 4.0. Lai strādātu ar TPL, jums jāizmanto System.Threading.Tasks nosaukumvieta.

Kas ir uzdevumu plānotāji? Kāpēc mums tie ir vajadzīgi?

Kā tagad tiek plānoti uzdevumi? Nu, ir komponents, ko sauc par uzdevumu plānotāju, kas ir atbildīgs par jūsu uzdevumu plānošanu. Būtībā tā ir abstrakcija zema līmeņa objektam, kas var rindot jūsu uzdevumus uz pavedieniem.

.NET Framework nodrošina divus uzdevumu plānotājus. Tie ietver noklusējuma uzdevumu plānotāju, kas darbojas .NET Framework pavedienu pūlā, un citu uzdevumu plānotāju, kas tiek izpildīts norādītā mērķa sinhronizācijas kontekstā. Ņemiet vērā, ka TPL noklusējuma uzdevumu plānotājs izmanto .NET Framework pavedienu kopas priekšrocības. Šo pavedienu kopu savukārt pārstāv klase ThreadPool, kas atrodas sistēmā.Threading.Tasks.

Lai gan lielākoties pietiks ar noklusējuma uzdevumu plānotāju, iespējams, vēlēsities izveidot savu pielāgoto uzdevumu plānotāju, lai nodrošinātu pievienotās funkcijas, t.i., funkcijas, kuras nenodrošina noklusējuma uzdevumu plānotājs. Šādas funkcijas var būt FIFO izpilde, vienlaicīguma pakāpe utt.

Paplašiniet klasi TaskScheduler C #

Lai izveidotu savu pielāgoto uzdevumu plānotāju, jums jāizveido klase, kas paplašina sistēmu System.Threading.Tasks.TaskScheduler. Tātad, lai izveidotu pielāgotu uzdevumu plānotāju, jums jāpaplašina TaskScheduler abstraktā klase un jāignorē šādas metodes.

  • QueueTask atgriež spēkā neesošu un akceptē uzdevuma objektu kā parametru, un šī metode tiek izsaukta, kad jāplāno uzdevums
  • GetScheduledTasks atgriež visu ieplānoto uzdevumu sarakstu (precīzāk skaitāms skaitlis)
  • TryExecuteTaskInline tiek izmantots, lai izpildītu uzdevumus iekšēji, t.i., pašreizējā pavedienā. Šajā gadījumā uzdevumi tiek izpildīti bez nepieciešamības tos ievietot rindā

Šis koda fragments parāda, kā jūs varat paplašināt TaskScheduler klasi, lai ieviestu pielāgoto plānotāju C #.

publiskā klase CustomTaskScheduler: TaskScheduler, IDisposable

    {

    }

Kā mēs iepriekš apspriedām šajā rakstā, pielāgoto uzdevumu plānotājā jums būs jāatspējo metodes GetScheduledTasks, QueueTask un TryExecuteTaskInline.

publiski aizzīmogota klase CustomTaskScheduler: TaskScheduler, IDisposable

  {

aizsargāts ignorēt IEnumerable GetScheduledTasks ()

        {

//DARĪT

        }

aizsargāts ignorēt spēkā neesošu QueueTask (uzdevuma uzdevums)

        {

//DARĪT

        }

aizsargāts ignorēt bool TryExecuteTaskInline (uzdevuma uzdevums, bool taskWasPreviouslyQueued)

        {

//DARĪT

        }

public void Iznīcināt ()

        {

//DARĪT

        }

  }

Izmantojiet BlockingCollection, lai saglabātu uzdevumu objektu kolekciju C #

Sāksim tagad ieviest mūsu pielāgoto uzdevumu plānotāju. Šis koda fragments parāda, kā jūs varat izmantot BlockingCollection, lai saglabātu uzdevumu objektu kolekciju.

publiski aizzīmogota klase CustomTaskScheduler: TaskScheduler, IDisposable

 {

privāta BlockingCollection taskCollection = jauna BlockingCollection ();

privāts tikai lasāms Thread mainThread = null;

publiskais CustomTaskScheduler ()

        {

mainThread = new Thread (jauns ThreadStart (Execute));

ja (! mainThread.IsAlive)

            {

mainThread.Start ();

            }

        }

private void Izpildīt ()

        {

foreach (var uzdevums taskCollection.GetConsumingEnumerable ())

            {

TryExecuteTask (uzdevums);

            }

        } 

// Citas metodes

  }

Skatiet klases CustomTaskScheduler konstruktoru. Ņemiet vērā, kā ir izveidots jauns pavediens un sācis palaist izpildes metodi.

Īstenot metodes GetScheduledTasks, QueueTask un TryExecuteTaskInline C #

Tālāk mums jāievieš trīs metodes, kas mums jāignorē mūsu pielāgoto uzdevumu plānotājā. Šīs trīs metodes ietver GetScheduledTasks, QueueTask un TryExecuteTaskInline.

GetScheduledTasks metode atgriež uzdevumu kolekcijas instanci kā IEnumerable. Tas tiek izmantots, lai jūs varētu uzskaitīt kolekciju, kā parādīts izpildes metodē. Metode QueueTask pieņem uzdevuma objektu kā parametru un saglabā to uzdevumu kolekcijā. TryExecuteTaskInline metodei nav ieviešanas - es to atstāšu lasītāja ziņā.

aizsargāts ignorēt IEnumerable GetScheduledTasks ()

        {

atgriešanas uzdevumiCollection.ToArray ();

        }

aizsargāts ignorēt spēkā neesošu QueueTask (uzdevuma uzdevums)

        {

ja (uzdevums! = null)

taskCollection.Add (uzdevums);

        }

aizsargāts ignorēt bool TryExecuteTaskInline (uzdevuma uzdevums, bool taskWasPreviouslyQueued)

        {

atgriezties nepatiesa;

        }

Pilnīgs CustomTaskScheduler piemērs C #

Šis kodu saraksts ilustrē mūsu CustomTaskScheduler galīgo versiju.

publiski aizzīmogota klase CustomTaskScheduler: TaskScheduler, IDisposable

    {

privāts BlockingCollection taskCollection = jauns BlockingCollection ();

privāts tikai lasāms Thread mainThread = null;

publiskais CustomTaskScheduler ()

        {

mainThread = new Thread (jauns ThreadStart (Execute));

ja (! mainThread.IsAlive)

            {

mainThread.Start ();

            }

        }

private void Izpildīt ()

        {

foreach (var task in tasksCollection.GetConsumingEnumerable ())

            {

TryExecuteTask (uzdevums);

            }

        }

aizsargāts ignorēt IEnumerable GetScheduledTasks ()

        {

atgriešanas uzdevumiCollection.ToArray ();

        }

aizsargāts ignorēt spēkā neesošu QueueTask (uzdevuma uzdevums)

        {

ja (uzdevums! = null)

taskCollection.Add (uzdevums);

        }

aizsargāts ignorēt bool TryExecuteTaskInline (uzdevuma uzdevums, bool taskWasPreviouslyQueued)

        {

atgriezties nepatiesa;

        }

private void Iznīcināt (bool iznīcināšana)

        {

ja (! apglabāšana) atgriežas;

taskCollection.CompleteAdding ();

taskCollection.Dispose ();

        }

public void Iznīcināt ()

        {

Iznīcināt (taisnība);

GC.SuppressFinalize (tas);

        }

    }

Lai izmantotu tikko ieviesto pielāgoto uzdevumu plānotāju, varat izmantot šādu koda fragmentu:

CustomTaskScheduler taskScheduler = jauns CustomTaskScheduler ();

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

Kā izdarīt vairāk C #:

  • Kad izmantot abstraktu klasi un saskarni C #
  • Kā strādāt ar AutoMapper C #
  • Kā lietot lambda izteicienus C #
  • Kā strādāt ar Action, Func un Predicate delegātiem C #
  • Kā strādāt ar delegātiem C #
  • Kā ieviest vienkāršu reģistrētāju C #
  • Kā strādāt ar atribūtiem C #
  • Kā strādāt ar log4net C #
  • Kā ieviest krātuves dizaina modeli C #
  • Kā strādāt ar refleksiju C #
  • Kā strādāt ar filesystemwatcher C #
  • Kā veikt slinku inicializāciju C #
  • Kā strādāt ar MSM C #
  • Kā strādāt ar paplašināšanas metodēm C #
  • Kā mums izteikt lambda izteicienus C #
  • Kad lietot svārstīgo atslēgvārdu C #
  • Kā izmantot ienesīguma atslēgvārdu C #
  • Kā ieviest polimorfismu C #
  • Kā izveidot savu uzdevumu plānotāju C #
  • Kā strādāt ar RabbitM C #
  • Kā strādāt ar dubultošanos C #
  • Virtuālu un abstraktu metožu izpēte C #
$config[zx-auto] not found$config[zx-overlay] not found