Viacvláknové v C # S úlohami

počítačové programovanie výraz „vlákno“ je skratka pre vlákno vykonávania, v ktorom procesor sleduje zadanú cestu cez váš kód. Koncept sledovania viac ako jedného vlákna súčasne predstavuje tému viacnásobného spracovania úloh a viacnásobného zavádzania vlákien.

Aplikácia obsahuje jeden alebo viac procesov. Proces si predstavte ako program bežiaci na vašom počítači. Teraz má každý proces jedno alebo viac vlákien. Herná aplikácia môže mať vlákno na načítanie prostriedkov z disku, ďalšiu na vykonanie AI a ďalšiu na spustenie hry ako servera.

V prostredí .NET / Windows operačný systém prideľuje čas procesora vláknu. Každé vlákno sleduje obsluhy výnimiek a prioritu, pri ktorej sa spúšťa, a má kam niekde uložiť kontext vlákna, kým sa nespustí. Kontext vlákna je informácia, ktorú vlákno potrebuje obnoviť.

Multi-Tasking With Threads

Vlákna zaberajú trochu pamäte a ich vytváranie zaberie trochu času, takže ich obvykle veľa nechcete používať. Pamätajte si, že súťažia o čas procesora. Ak má váš počítač viac CPU, Windows alebo .NET môžu spustiť každé vlákno na inom CPU, ale ak niekoľko vlákien beží na tom istom CPU, potom iba jeden môže byť aktívny naraz a vyžaduje prepínanie vlákien Čas.

instagram viewer

CPU spustí vlákno pre niekoľko miliónov inštrukcií a potom prejde na iné vlákno. Všetky registre CPU, aktuálny bod vykonávania programu a zásobník sa musia niekde uložiť pre prvé vlákno a potom obnoviť odinakiaľ pre ďalšie vlákno.

Vytvorenie vlákna

V systéme názvov. Threading, nájdete typ vlákna. Konštrukčné vlákno (ThreadStart) vytvorí inštanciu vlákna. Avšak, v poslednej dobe C # kód, je pravdepodobnejšie odovzdať výraz lambda, ktorý volá metódu s akýmikoľvek parametrami.

Ak si nie ste istí lambda výrazy, možno by bolo dobré vyskúšať si LINQ.

Tu je príklad vlákna, ktoré je vytvorené a spustené:

pomocou systému;
pomocou systému. rezanie závitov;
menný priestor ex1
{
program triedy
{
verejné statické medzery Write1 ()
{
Konzoly. Write ('1');
Závit. Režim spánku (500);
}
static void Main (string [] args)
{
var task = new Thread (Write1);
úloha. Start ();
pre (var i = 0; i <10; i ++)
{
Konzoly. Zápis ('0');
Konzoly. Zápis (úloha. Je nažive? „A“: „D“);
Závit. Režim spánku (150);
}
Konzoly. ReadKey ();
}
}
}

Všetko, čo robí tento príklad, je zapísať "1" do konzoly. Hlavné vlákno zapíše do konzoly 10-krát „0“, vždy za ním „A“ alebo „D“ v závislosti od toho, či je druhé vlákno stále živé alebo mŕtve.

Druhé vlákno sa spustí iba raz a zapíše znak „1.“ Po polsekundovom oneskorení v vláknach Write1 () sa vlákno dokončí a úloha. IsAlive v hlavnej slučke teraz vracia „D.“

Paralelná knižnica vlákien a úloh

Namiesto vytvárania vlastného vlákna, ak to skutočne nepotrebujete, využite oblasť vlákien. Z verzie .NET 4.0 máme prístup do knižnice úloh Parallel Library (TPL). Ako v predchádzajúcom príklade, opäť potrebujeme trochu LINQ a áno, sú to všetky výrazy lambda.

Úlohy používajú Vlákno vlákno v zákulisí, ale lepšie využite vlákna v závislosti od používaného počtu.

Hlavným objektom v TPL je úloha. Toto je trieda, ktorá predstavuje asynchrónnu operáciu. Najbežnejším spôsobom, ako začať veci bežať, je Úloha. Factory. ZačaťNový ako v:

Úloha. Factory. StartNew (() => DoSomething ());

Kde DoSomething () je spustená metóda. Je možné vytvoriť úlohu a nechať ju spustiť okamžite. V takom prípade použite iba nasledovnú úlohu:

var t = nová úloha (() => Konzola. WriteLine ( "Hello"));
...
t. Štart ();

To nespustí vlákno, kým nezvoláte .Start (). V nasledujúcom príklade je päť úloh.

pomocou systému;
pomocou systému. rezanie závitov;
pomocou systému. Threading. úlohy;
menný priestor ex1
{
program triedy
{
verejné statické medzery Write1 (int i)
{
Konzoly. Zápis (i);
Závit. Režim spánku (50);
}
static void Main (string [] args)
{
pre (var i = 0; i <5; i ++)
{
var hodnota = i;
var runningTask = Úloha. Factory. StartNew (() => Write1 (value));
}
Konzoly. ReadKey ();
}
}
}

Spustite to a dostanete číslice 0 až 4 výstup v náhodnom poradí, ako je 03214. Je to preto, že poradie vykonávania úloh určuje .NET.

Možno vás zaujíma, prečo je potrebná hodnota var = i. Skúste ju odstrániť a zavolajte na Write (i), a uvidíte niečo neočakávané, napríklad 55555. Prečo je toto? Je to preto, že úloha zobrazuje hodnotu i v čase vykonávania úlohy, nie pri vytvorení úlohy. Vytvorením nového premenlivý zakaždým v cykle je každá z piatich hodnôt správne uložená a vyzdvihnutá.