Več-navoj v C # z nalogami

The Računalniško programiranje Izraz "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 lahko navezana nit 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 spremlja upravljavce izjem in prednost, 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, lahko Windows ali .NET vsaka nit v drugem CPU-ju zaženeta, če pa več niti deluje v istem CPU-ju, potem je lahko hkrati hkrati samo en in preklapljanje niti traja čas.

instagram viewer

CPU vodi nit za nekaj milijonov navodil, nato pa preide na drugo nit. Vsi registri CPU-ja, trenutna točka izvajanja programa in zlaganje morajo biti shranjeni nekje za prvo nit in nato obnovljeni od nekje drugje za naslednjo nit.

Ustvarjanje niti

V sistemu imen. Niti, boste našli vrsto niti. Konstrukcijska nit (ThreadStart) ustvari primerek niti. Vendar v zadnjem času C # koda, večja je verjetnost, da bo posredoval izraz lambda, ki kliče metodo s poljubnimi parametri.

Če niste prepričani lambda izrazi, morda bi bilo vredno preveriti LINQ.

Tu je primer niti, ki je ustvarjena in zagnana:

z uporabo sistema;
z uporabo sistema. Niti;
imenskega prostora ex1
{
razred program
{
javna statična neveljavnost Write1 ()
{
Konzola. Napišite ('1');
Niti. Spanje (500);
}
statični void Main (string [] args)
{
var naloga = nova nit (Write1);
naloga. Start ();
za (var i = 0; i <10; i ++)
{
Konzola. Napišite ('0');
Konzola. Pišite (naloga. JeAlive? 'A': 'D');
Niti. Spanje (150);
}
Konzola. 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 opravilo. 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 tu potrebujemo malo LINQ-a in ja, vse to so lambda izrazi.

Naloge uporablja Navojni bazen zakulisje, vendar bolje izkoristite niti, odvisno od števila v uporabi.

Glavni predmet v TPL je naloga. To je razred, ki predstavlja asinhrono operacijo. Najpogostejši način, da začnete teči, je naloga. Tovarna. StartNew kot v:

Naloga. Tovarna. 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 (() => konzola. 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. Niti;
z uporabo sistema. Niti. Naloge;
imenskega prostora ex1
{
razred program
{
javna statična void Write1 (int i)
{
Konzola. Napišite (i);
Niti. Spanje (50);
}
statični void Main (string [] args)
{
za (var i = 0; i <5; i ++)
{
vrednost var = i;
var runningTask = Naloga. Tovarna. StartNew (() => Write1 (vrednost));
}
Konzola. ReadKey ();
}
}
}

Zaženite to in dobite izhod številk od 0 do 4 v naključnem vrstnem redu, kot je 03214. To je zato, ker vrstni red izvajanja nalog določi .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 to? To je zato, ker naloga prikazuje vrednost i v času, ko se naloga izvaja, in ne, ko je bila naloga ustvarjena. Z ustvarjanjem novega spremenljivka vsakič v zanki je vsaka od petih vrednosti pravilno shranjena in pobrana.

instagram story viewer