Življenje

Kako z več nalogami uporabljati naloge v C #

Kako z več nalogami uporabljati naloge v C #

Izraz računalniškega programiranja "nit" je kratek za izvedbo niti, v katerem procesor sledi določeni poti skozi vašo kodo. Koncept sledenja več kot ene niti hkrati uvaja predmet večopravilnosti in večnarezanja.

Aplikacija ima v njej enega ali več procesov. Mislite na postopek kot na program, ki se izvaja v računalniku. Zdaj ima vsak postopek eno ali več niti. V aplikaciji za igre je morda navoj za nalaganje virov z diska, drugi za AI in drugi za igro kot strežnik.

V .NET / Windows operacijski sistem dodeli procesorskemu času nit. Vsaka nit sledi upravljavcem izjem in prioriteti, pri kateri se izvaja, in nekje shrani kontekst niti, dokler se ne zažene. Kontekst teme je informacija, ki jo mora nit nadaljevati.

Večopravilnost z nitmi

Niti zavzamejo malo spomina in ustvarjanje le-teh traja malo časa, zato jih pogosto ne želite uporabljati. Ne pozabite, da tekmujejo za čas procesorja. Če ima vaš računalnik več CPU-jev, bi Windows ali .NET lahko izvajal vsako nit v različnem CPU-ju, če pa v istem CPU-ju deluje več niti, je hkrati lahko aktiven samo en in preklapljanje niti zahteva čas.

CPU vodi nit za nekaj milijonov navodil in nato preklopi na drugo nit. Vsi registri CPU-ja, trenutna točka izvajanja programa in sklad se morajo shraniti nekje za prvo nit in nato obnoviti od nekje drugje za naslednjo nit.

Ustvarjanje niti

V sistemu imen. V nitkah boste našli vrsto niti. Konstrukcijska nit (ThreadStart) ustvari primerek niti. Vendar je v nedavni kodi C # bolj verjetno, da bo prešel v lambda izraz, ki kliče metodo s kakršnimi koli parametri.

Če niste prepričani o lambda izrazih, je morda vredno preveriti LINQ.

Tu je primer niti, ki je ustvarjena in zagnana:

z uporabo sistema;

z uporabo sistema System.Threading;
imenskega prostora ex1
{
razred program
{
javna statična neveljavnost Write1 ()
{
Console.Write ('1');
Niti.Sep (500);
}
statična praznina Main (string args)
{
var naloga = nova nit (Write1);
task.Start ();
za (var i = 0; i <10; i ++)
{
Console.Write ('0');
Console.Write (task.IsAlive? 'A': 'D');
Niti.Sep (150);
}
Console.ReadKey ();
}
}
}

Vse ta primer je napisati "1" na konzolo. Glavna nit na konzolo zapiše "0", vsakič pa sledi "A" ali "D", odvisno od tega, ali je druga nit še živa ali mrtva.

Druga nit se zažene samo enkrat in napiše "1." Po pol sekunde zakasnitve niti Write1 () se nit zaključi in naloga Task.IsAlive v glavni zanki zdaj vrne "D."

Knjižnica niti in vzporedna knjižnica opravil

Namesto da ustvarite svojo nit, razen če tega resnično morate storiti, uporabite navojni bazen. Od .NET 4.0 imamo dostop do knjižnice opravilnih vzporednih opravil (TPL). Kot v prejšnjem primeru tudi tukaj potrebujemo malo LINQ-a in ja, vse to so lambda izrazi.

Opravila uporabljajo navoj nit za zakulisjem, vendar bolje uporabljajo niti, odvisno od števila v uporabi.

Glavni predmet v TPL je naloga. To je razred, ki predstavlja asinhrono operacijo. Najpogostejši način za začetek izvajanja stvari je s programom Task.Factory.StartNew kot v:

Task.Factory.StartNew (() => DoSomething ());

Kjer je DoSomething () metoda, ki se izvaja. Nalogo je mogoče ustvariti, ne da bi jo takoj zagnali. V tem primeru uporabite le Nalogo, kot je ta:

var t = nova naloga (() => Console.WriteLine ("Pozdravljeni"));

t.Start ();

Ta nit se ne začne, dokler se ne pokliče .Start (). V spodnjem primeru je pet nalog.

z uporabo sistema;
z uporabo sistema System.Threading;
z uporabo System.Threading.Tasks;
imenskega prostora ex1
{
razred program
{
javna statična void Write1 (int i)
{
Console.Write (i);
Niti.Sep (50);
}
statična praznina Main (string args)
{
za (var i = 0; i <5; i ++)
{
vrednost var = i;
var runningTask = Task.Factory.StartNew (() => Write1 (vrednost));
}
Console.ReadKey ();
}
}
}

Zaženite to in dobite izhode številk od 0 do 4 v naključnem vrstnem redu, na primer 03214. To je zato, ker vrstni red izvajanja opravila določa .NET.

Morda se sprašujete, zakaj je vrednost var = = i potrebna. Poskusite ga odstraniti in pokličite Write (i) in videli boste nekaj nepričakovanega, kot je 55555. Zakaj je to? To je zato, ker naloga prikazuje vrednost i v času, ko se naloga izvaja, ne pa ko je bila naloga ustvarjena. Z ustvarjanjem nove spremenljivke vsakič v zanki je vsaka od petih vrednosti pravilno shranjena in pobrana.


Video, Sitemap-Video, Sitemap-Videos