Programiranje

Na metodah Task.Factory.StartNew in Task.Run

Ko ustvarjate naloge z metodama Task.Factory.StartNew ali Task.Run, morate pri pisanju asinhrone kode upoštevati nekatere pomembne točke. V večini primerov je priporočljivo, da se izognete uporabi metode Task.Factory.StartNew, če delate z asinhrono kodo. Če delate z vzporedno kodo, bi rekel, da je StartNew dobra izbira.

Načrtovalnik opravil je komponenta, ki je odgovorna za razporejanje nalog; Okvir .Net vam ponuja dva načrtovalca opravil. Obstaja privzeti razporejevalnik opravil, ki se izvaja v okviru niti .NET Framework, in razporejevalnik opravil, ki se izvaja v kontekstu sinhronizacije določenega cilja. Privzeti načrtovalnik opravil bo zadostoval večino časa, lahko pa ustvarite tudi lasten načrtovalnik opravil po meri, da zagotovite dodatne funkcije. Za izdelavo lastnega načrtovalnika opravil po meri bi morali ustvariti razred, ki razširja razred System.Threading.Tasks.TaskScheduler.

Kako ustvarim opravila z uporabo vzporedne knjižnice opravil?

Naloge lahko v .Netu ustvarite in zaženete na več načinov. Za ustvarjanje nalog (enota dela, ki jo je mogoče načrtovati po načrtu) morate uporabiti razred System.Threading.Tasks.Task ali System.Threading.Tasks.Task. Medtem ko se prvi uporablja za ustvarjanje naloge, ki ne vrne vrednosti, se druga uporablja za ustvarjanje nalog, ki imajo vrnjene vrednosti. Lastnost Task.Factory je primerek razreda TaskFactory. Ta lastnost se uporablja za ustvarjanje in razporejanje nalog. Medtem ko metoda Task.Factory.StartNew deluje kot operacija vilic in se uporablja za ustvarjanje in zagon novih nalog, metoda Wait deluje tako kot operacija združevanja in čaka, da je naloga dokončana.

Naslednji delček kode prikazuje, kako lahko uporabite metodo Task.Factory.StartNew.

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

Opravilo lahko ustvarite tudi z metodo Task.Run, kot je prikazano v spodnjem delčku kode.

javna asinh. naloga DoSomeWork ()

        {

počakajte Task.Run (() => TestMethod ());

        }

void TestMethod ()

        {

Console.WriteLine ("Pozdravljeni, svet!");

        }

Če želite vrniti vrednost iz opravila, lahko izkoristite metodo Task.FromResult, kot je prikazano v spodnjem delčku kode.

javna asinh. naloga DoSomeWork ()

   {

besedilo niza = počakajte Task.FromResult (GetMessage ());

   }

zasebni niz GetMessage ()

   {

vrnitev "Pozdravljen svet!";

   }

Naloge lahko ustvarite tudi z delegatom ali dejanjem. Naslednji delček kode prikazuje, kako lahko ustvarite naloge z uporabo dejanj in delegatov.

Task task1 = novo opravilo (novo dejanje (prikaz));

task1.Start ();

Task task2 = novo opravilo (delegat {Display ();});

task2.Start ();

Naloge lahko ustvarite tudi z uporabo lamba in anonimnih metod.

Task.Factory.StartNew in Task.Run

Task.Factory.StartNew je hiter način za ustvarjanje in zagon opravila. Upoštevajte, da je klic Task.Factory.StartNew funkcionalno enakovreden ustvarjanju primerka opravila in nato klicanju metode Start na primerku. Vendar ga ni priporočljivo uporabljati iz zadostnih razlogov. Če želite zagnati sinhrono kodo, Task.Factory.StartNew ni dobra izbira.

Če je na voljo načrtovalnik opravil, bo metoda StartNew izvedla nalogo v tem načrtovalniku opravil. Nasprotno, če načrtovalnik ni na voljo, bi opravil nalogo v niti niti področja. Treba je opozoriti, da je Task.Factory.StartNew privzeto pri TaskScheduler.Current in ne TaskScheduler.Default.

Upoštevajte, da je klic Task.Run (dejanje) enakovreden naslednji izjavi: Task.Factory.StartNew (action, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

Nasprotno, klic Task.Factory.StartNew (action) je enakovreden naslednji izjavi:

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

Če boste morda želeli uporabiti Task.Factory.StartNew, če ste ustvarili načrtovalnik opravil po meri in mu eksplicitno posredovali primerek načrtovalca. Vedno priporočam uporabo programa Task.Run, saj je veliko preprostejši in ima varnejše privzete vrednosti. Z drugimi besedami, izogibati se moramo uporabi Task.Factory.StartNew, razen če ni treba ustvariti razporejevalnika opravil in ga nato izrecno posredovati pri klicanju metode StartNew za ustvarjanje nove naloge in razporejanje. Če bi uporabili metodo TaskFactory.StartNew učinkovito in zanesljivo, bi morali uporabiti načrtovalnik opravil po meri in nato določiti CancellationToken in TaskCreationOptions.

Metodo Task.Run priporočamo za uporabo, kadar vam ni treba imeti natančnega nadzora nad načrtovanjem niti in njenimi zapletenostmi. Task.Run bi morali uporabljati predvsem pri metodah, vezanih na CPU. Vendar pa morate Task.Run uporabljati med priklicem naloge in ne znotraj izvajanja naloge. Z drugimi besedami, Task.Run ne bi smeli uporabljati znotraj nobene izvedbe metode, temveč na mestu, kjer je metoda poklicana. Kot primer je naslednji delček kode primer "slabega" dela kode.

javno asinh. opravilo DownloadDataFromWebAsync (Uri uri)

        {

vrnitev čaka Task.Run (() =>

            {

z uporabo (WebClient webClient = new WebClient ())

                {

vrni webClient.DownloadString (uri);

                }

            });

        }

Glejte zgornji delček kode. Metoda ni razširljiva, saj bi blokirala nit v ozadju, potegnila nit iz področja niti in jo sinhrono izvedla. Zato bi porabil več virov v vašem sistemu.

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