Programmēšana

Par Task.Factory.StartNew un Task.Run metodēm

Veidojot uzdevumus, izmantojot metodes Task.Factory.StartNew vai Task.Run, rakstot asinhrono kodu, jums jāpatur prātā daži svarīgi punkti. Vairumā gadījumu ieteicams izvairīties no metodes Task.Factory.StartNew, ja strādājat ar asinhrono kodu. Ja jūs strādājat ar paralēlo kodu, es teiktu, ka StartNew ir laba izvēle.

Uzdevumu plānotājs ir sastāvdaļa, kas ir atbildīga par uzdevumu plānošanu; .Net ietvars nodrošina divus uzdevumu plānotājus. Ir noklusējuma uzdevumu plānotājs, kas darbojas .Net Framework pavedienu pūlā, un ir uzdevumu plānotājs, kas tiek izpildīts norādītā mērķa sinhronizācijas kontekstā. Ar noklusējuma uzdevumu plānotāju lielāko daļu laika pietiks, taču varat izveidot arī savu pielāgoto uzdevumu plānotāju, lai nodrošinātu pievienotās funkcijas. Lai izveidotu savu pielāgoto uzdevumu plānotāju, jums jāizveido klase, kas paplašina sistēmu System.Threading.Tasks.TaskScheduler.

Kā izveidot uzdevumus, izmantojot uzdevumu paralēlo bibliotēku?

Ir vairāki veidi, kā varat izveidot un sākt uzdevumus .Net. Lai izveidotu uzdevumus (plānojama darba vienība), jums jāizmanto sistēma System.Threading.Tasks.Task vai System.Threading.Tasks.Task. Kamēr pirmais tiek izmantots, lai izveidotu uzdevumu, kas neatgriež vērtību, otrais tiek izmantots, lai izveidotu uzdevumus, kuriem ir atgriešanās vērtības. Īpašums Task.Factory ir klases TaskFactory eksemplārs. Šis rekvizīts tiek izmantots uzdevumu izveidošanai un plānošanai. Kamēr metode Task.Factory.StartNew darbojas kā dakšas darbība un tiek izmantota jaunu uzdevumu izveidošanai un uzsākšanai, metode Wait darbojas tāpat kā pievienošanās operācija un gaida, kamēr uzdevums būs pabeigts.

Šis koda fragments parāda, kā izmantot metodi Task.Factory.StartNew.

Task.Factory.StartNew (() => TestMethod (), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);

Uzdevumu var izveidot arī, izmantojot metodi Task.Run, kā parādīts zemāk esošajā koda fragmentā.

publiskais asinhronais uzdevums DoSomeWork ()

        {

pagaidiet Task.Run (() => TestMethod ());

        }

anulēt TestMethod ()

        {

Console.WriteLine ("Sveika pasaule!");

        }

Ja vēlaties atgriezt vērtību no uzdevuma, varat izmantot metodes Task.FromResult priekšrocības, kā parādīts zemāk esošajā koda fragmentā.

publiskais asinhronais uzdevums DoSomeWork ()

   {

virknes teksts = gaidiet Task.FromResult (GetMessage ());

   }

privāta virkne GetMessage ()

   {

atgriezties "Sveika pasaule!";

   }

Varat arī izveidot uzdevumus, izmantojot delegātu vai darbību. Šis koda fragments parāda, kā jūs varat izveidot uzdevumus, izmantojot darbības un delegātus.

Task task1 = new Task (jauna darbība (displejs));

uzdevums1.Sākt ();

Task task2 = new Task (deleģēt {Display ();});

task2.Start ();

Varat arī izveidot uzdevumus, izmantojot lamba un anonīmas metodes.

Task.Factory.StartNew un Task.Run

Task.Factory.StartNew ir ātrs uzdevuma izveides un palaišanas veids. Ņemiet vērā, ka izsaukums uz Task.Factory.StartNew ir funkcionāli ekvivalents uzdevuma instances izveidošanai un pēc tam instances izsaukšanai Sākt. Tomēr to nav ieteicams lietot daudzu iemeslu dēļ. Ja vēlaties izpildīt sinhrono kodu, Task.Factory.StartNew nav laba izvēle.

Ņemiet vērā, ka, ja ir pieejams uzdevumu plānotājs, metode StartNew izpildīs uzdevumu šajā uzdevumu plānotājā. Gluži pretēji, ja plānotājs nav pieejams, tas izpildīs uzdevumu pavedienu kopas pavedienā. Jāatzīmē, ka Task.Factory.StartNew pēc noklusējuma ir TaskScheduler.Current, nevis TaskScheduler.Default.

Ņemiet vērā, ka izsaukums uz Task.Run (darbība) ir ekvivalents šim apgalvojumam: Task.Factory.StartNew (darbība, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

Gluži pretēji, izsaukums uz Task.Factory.StartNew (darbība) ir līdzvērtīgs šim apgalvojumam:

Task.Factory.StartNew (darbība, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Current);

Ja, iespējams, vēlaties izmantot Task.Factory.StartNew, ja esat izveidojis pielāgotu uzdevumu plānotāju un tam skaidri nodevis plānotāja instanci. Es vienmēr iesaku izmantot Task.Run, jo tas ir daudz vienkāršāk un drošāki noklusējumi. Citiem vārdiem sakot, mums vajadzētu izvairīties no Task.Factory.StartNew izmantošanas, ja vien nav nepieciešams izveidot uzdevumu plānotāju un pēc tam to skaidri nodot, izsaucot StartNew metodi, lai izveidotu jaunu uzdevumu un to ieplānotu. Ja izmantojat metodi TaskFactory.StartNew efektīvi un droši, jums jāizmanto pielāgots uzdevumu plānotājs un pēc tam jānorāda CancellationToken un TaskCreationOptions.

Metode Task.Run ir ieteicama, ja jums nav nepieciešams daudz sīki kontrolēt pavedienu plānošanu un tās sarežģījumus. Jums jāizmanto uzdevums. Palaist galvenokārt uz CPU saistītām metodēm. Tomēr jums jāizmanto Task.Run, vienlaikus izsaucot uzdevumu, nevis uzdevuma īstenošanas iekšpusē. Citiem vārdiem sakot, jums vajadzētu izmantot uzdevumu. Palaidiet nevis kādā metodes ieviešanā, bet tajā vietā, kur metode tiek izsaukta. Šis koda fragments ir piemērs "sliktam" koda fragmentam.

publiskais asinhronais uzdevums DownloadDataFromWebAsync (Uri uri)

        {

atgriešanās gaida Task.Run (() =>

            {

izmantojot (WebClient webClient = new WebClient ())

                {

atgriezt webClient.DownloadString (uri);

                }

            });

        }

Skatiet iepriekš sniegto koda fragmentu. Metode nav mērogojama, jo tā bloķētu fona pavedienu, izgūtu pavedienu no pavedienu kopas un izpildītu tajā sinhroni. Tādējādi tas patērētu vairāk resursu jūsu sistēmā.

$config[zx-auto] not found$config[zx-overlay] not found