Ohjelmointi

On Task.Factory.StartNew ja Task.Run -menetelmät

Kun luot tehtäviä Task.Factory.StartNew- tai Task.Run-menetelmillä, sinun on pidettävä mielessä tietyt tärkeät seikat kirjoitettaessa asynkronista koodia. Useimmissa tapauksissa on suositeltavaa välttää Task.Factory.StartNew-menetelmää, jos työskentelet asynkronisen koodin kanssa. Jos työskentelet rinnakkaisella koodilla, sanoisin, että StartNew on hyvä valinta.

Tehtävien ajoitus on komponentti, joka vastaa tehtävien ajoituksesta; .Net-kehys tarjoaa sinulle kaksi tehtävien ajoitusta. Siellä on oletusarvoinen tehtävien ajoitus, joka toimii .Net-kehyskierre poolissa, ja tehtävien ajoitus, joka suorittaa määritetyn kohteen synkronointikontekstissa. Oletustehtävien ajoitin riittää suurimman osan ajasta, mutta voit myös rakentaa oman mukautetun tehtävien ajoituksen tarjota lisätoimintoja. Oman mukautetun tehtävien ajoituksen rakentamiseksi sinun on luotava luokka, joka laajentaa System.Threading.Tasks.TaskScheduler-luokkaa.

Kuinka luon Tehtävät käyttämällä Task Parallel Library -kirjastoa?

On useita tapoja luoda ja aloittaa tehtäviä .Netissä. Sinun on käytettävä System.Threading.Tasks.Task- tai System.Threading.Tasks.Task-luokkaa tehtävien luomiseen (ajoitettava työyksikkö). Ensimmäistä käytetään tehtävän luomiseen, joka ei palauta arvoa, jälkimmäistä käytetään tehtävien luomiseen, joilla on palautusarvoja. Ominaisuus Task.Factory on TaskFactory-luokan ilmentymä. Tätä ominaisuutta käytetään tehtävien luomiseen ja ajoitukseen. Vaikka Task.Factory.StartNew-menetelmä toimii kuin haarukkaoperaatio ja sitä käytetään uusien tehtävien luomiseen ja aloittamiseen, Wait-menetelmä toimii samalla tavalla kuin liittämistoiminto ja odottaa tehtävän suorittamista.

Seuraava koodinpätkä kuvaa, kuinka voit käyttää Task.Factory.StartNew-menetelmää.

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

Voit myös luoda tehtävän käyttämällä Task.Run-menetelmää alla olevan koodinpätkän mukaisesti.

julkinen asynkronointi Tehtävä DoSomeWork ()

        {

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

        }

mitätön TestMethod ()

        {

Console.WriteLine ("Hei maailma!");

        }

Jos haluat palauttaa arvon tehtävästä, voit hyödyntää Task.FromResult-menetelmää alla olevan koodinpätkän mukaisesti.

julkinen asynkronointi Tehtävä DoSomeWork ()

   {

merkkijonoteksti = odota Task.FromResult (GetMessage ());

   }

yksityinen merkkijono GetMessage ()

   {

palauta "Hei maailma!";

   }

Voit myös luoda tehtäviä edustajan tai toiminnon avulla. Seuraava koodinpätkä osoittaa, kuinka voit luoda tehtäviä toimintojen ja edustajien avulla.

Tehtävätehtävä1 = uusi tehtävä (uusi toiminto (näyttö));

task1.Start ();

Tehtävätehtävä2 = uusi Tehtävä (delegoi {Näyttö ();});

tehtävä2.Start ();

Voit myös luoda tehtäviä lamba- ja nimettömillä menetelmillä.

Task.Factory.StartNew ja Task.Run

Task.Factory.StartNew on nopea tapa luoda ja käynnistää tehtävä. Huomaa, että kutsu Task.Factory.StartNew-funktiolle vastaa toiminnallisesti tehtävän ilmentymän luomista ja sitten ilmentymän aloitusmenetelmän kutsumista. Sitä ei kuitenkaan suositella käytettäväksi runsaista syistä. Jos haluat suorittaa synkronisen koodin, Task.Factory.StartNew ei ole hyvä valinta.

Huomaa, että jos tehtävien ajoitus on käytettävissä, StartNew-menetelmä suorittaa tehtävän kyseisellä tehtävien ajoituksella. Päinvastoin, jos ajoitinta ei ole saatavana, se suorittaa tehtävän ketjupoolilangassa. On huomattava, että Task.Factory.StartNew on oletuksena TaskScheduler.Current eikä TaskScheduler.Default.

Huomaa, että kutsu Task.Run (toiminto) vastaa seuraavaa lausetta: Task.Factory.StartNew (toiminto, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

Päinvastoin, kutsu Task.Factory.StartNew (toiminto) vastaa seuraavaa lausetta:

Task.Factory.StartNew (toiminto, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Current);

Jos haluat käyttää Task.Factory.StartNew-sovellusta, jos olet luonut mukautetun tehtävien ajoituksen ja välittänyt sille nimenomaisesti ajastimen ilmentymän. Suosittelen aina käyttämään Task.Run-ohjelmaa, koska se on paljon yksinkertaisempi ja sillä on turvallisemmat oletusasetukset. Toisin sanoen meidän tulisi välttää Task.Factory.StartNew-sovelluksen käyttöä, ellei sinun tarvitse luoda tehtävien ajoitinta ja siirtää se sitten nimenomaisesti, kun soitat StartNew-menetelmää uuden tehtävän luomiseksi ja aikatauluttamiseksi. Jos käytit TaskFactory.StartNew-menetelmää tehokkaasti ja luotettavasti, sinun on käytettävä mukautettua tehtävien ajoitinta ja määritettävä sitten CancellationToken ja TaskCreationOptions.

Task.Run-menetelmää suositellaan käytettäväksi, kun sinun ei tarvitse hallita paljon hienojakoisesti ketjujen ajoitusta ja sen monimutkaisuutta. Käytä Task.Run-ohjelmaa ensisijaisesti suorittimen sidottuihin menetelmiin. Sinun tulisi kuitenkin käyttää Task.Run-ohjelmaa samalla kun kutsut tehtävää etkä sisällä tehtävän toteutusta. Toisin sanoen, sinun tulee käyttää Task.Run-toimintoa menetelmän missään toteutuksessa, mutta siinä vaiheessa, jossa menetelmää kutsutaan. Esimerkiksi seuraava koodinpätkä on esimerkki "huonosta" koodinpalasta.

julkinen asynkronointi Tehtävä DownloadDataFromWebAsync (Uri uri)

        {

paluu odota Task.Run (() =>

            {

käyttäen (WebClient webClient = new WebClient ())

                {

return webClient.DownloadString (uri);

                }

            });

        }

Katso yllä annettu koodinpätkä. Menetelmä ei ole skaalautuva, koska se estäisi taustalangan, haisi ketjun ketjupoolista ja suorittaisi sen synkronisesti. Siksi se kuluttaa enemmän resursseja järjestelmässäsi.