računalno programiranje Izraz "nit" skraćen je za nit izvršenja, u kojem procesor slijedi određeni put kroz vaš kôd. Koncept praćenja više odjednom niti uvodi predmet više zadataka i višestrukih navoja.
Aplikacija ima jedan ili više procesa u sebi. Zamislite proces kao program koji se izvodi na vašem računalu. Sada svaki postupak ima jednu ili više niti. Aplikacija za igru može imati nit za učitavanje resursa s diska, drugi za AI, a drugi za pokretanje igre kao poslužitelja.
U .NET / Windows, operativni sustav dodjeljuje procesorsko vrijeme niti. Svaka nit prati obrađivače iznimki i prioritet na kojem se izvodi te ima negdje za spremanje konteksta niti dok se ne pokrene. Kontekst teme je informacija koju nit mora nastaviti.
Više zadataka s nitima
Niti zauzimaju malo memorije i stvaranje istroši malo vremena, pa ih obično ne želite koristiti mnogo. Zapamtite, oni se natječu za procesorsko vrijeme. Ako vaše računalo ima više CPU-a, onda Windows ili .NET mogu pokrenuti svaku nit na drugom CPU-u, ali ako nekoliko niti pokreće isti procesor, tada samo jedan može biti aktivan istodobno i prebacivanje niti traje vrijeme.
CPU pokreće nit za nekoliko milijuna uputa, a zatim prelazi na drugu nit. Svi registri CPU-a, trenutna točka izvođenja programa i snop programa moraju se spremiti negdje za prvu nit, a zatim vratiti negdje drugdje za sljedeću nit.
Stvaranje niti
U prostoru imena. Threading, naći ćete vrstu niti. Navoj konstruktora (ThreadStart) stvara instancu niti. Međutim, u posljednje vrijeme C # koda, vjerojatnije je da će preći u lambda izrazu koji poziva metodu s bilo kojim parametrima.
Ako niste sigurni lambda izrazi, možda bi bilo vrijedno provjeriti LINQ.
Evo primjera niti koja se kreira i započinje:
pomoću sustava;
pomoću sustava. Threading;
imenski prostor ex1
{
razredni program
{
javna statička praznina Write1 ()
{
Konzola. Pišite ('1');
Nit. Spavanje (500);
}
statička praznina Main (string [] args)
{
var zadatak = nova nit (Write1);
zadatak. Početak() ;
za (var i = 0; i <10; i ++)
{
Konzola. Pišite ('0');
Konzola. Pisati (zadatak. Živ je? 'A': 'D');
Nit. Spavanje (150);
}
Konzola. ReadKey ();
}
}
}
Sve što ovaj primjer ima je napisati "1" na konzoli. Glavna nit 10 puta upiše "0" na konzolu, svaki put nakon čega slijedi "A" ili "D", ovisno o tome je li drugi nit još uvijek živ ili mrtav.
Druga nit pokreće se samo jednom i napiše "1." Nakon pola sekunde odgađanja niti Write1 (), nit se završava i Zadatak. IsAlive u glavnoj petlji sada vraća "D."
Biblioteka navoja i paralelna biblioteka zadataka
Umjesto da stvorite vlastiti konac, osim ako to stvarno ne morate učiniti, koristite bazen za navoje. Od .NET 4.0 imamo pristup biblioteci paralelnih zadataka (TPL). Kao i u prethodnom primjeru, opet nam treba malo LINQ-a, i da, sve su to lambda izrazi.
Zadaci koriste Navojni bazen iza scene, ali bolje koristite niti ovisno o broju u upotrebi.
Glavni objekt u TPL-u je zadatak. Ovo je klasa koja predstavlja asinhronu operaciju. Najčešći način za pokretanje stvari je zadatak. Tvornica. StartNew kao u:
Zadatak. Tvornica. StartNew (() => DoSomething ());
Gdje je DoSomething () metoda koja se izvodi. Moguće je stvoriti zadatak, a ne pokrenuti ga odmah. U tom slučaju koristite samo Zadatak ovako:
var t = novi zadatak (() => konzola. WriteLine ( "Halo"));
...
t. Početak();
To ne pokreće nit sve dok se ne pozove .Start (). U primjeru u nastavku pet je zadataka.
pomoću sustava;
pomoću sustava. Threading;
pomoću sustava. Threading. zadaci;
imenski prostor ex1
{
razredni program
{
javna statička praznina Write1 (int i)
{
Konzola. Napišite (i);
Nit. Spavanje (50);
}
statička praznina Main (string [] args)
{
za (var i = 0; i <5; i ++)
{
vrijednost vrijednost = i;
var runningTask = Zadatak. Tvornica. StartNew (() => Write1 (vrijednost));
}
Konzola. ReadKey ();
}
}
}
Pokrenite to i dobit ćete brojke od 0 do 4 u slučajnom redoslijedu, kao što je 03214. To je zato što redoslijed izvršavanja zadatka određuje .NET.
Možda se pitate zašto je vrijednost var = = i potrebna. Pokušajte ga ukloniti i nazovite Write (i), i vidjet ćete nešto neočekivano poput 55555. Zašto je ovo? To je zato što zadatak pokazuje vrijednost i u trenutku kad se zadatak izvršava, a ne kada je zadatak kreiran. Stvaranjem novog varijabla svaki put u petlji svaka se od pet vrijednosti ispravno pohrani i pokupi.