Daugialypis C # su užduotimis

click fraud protection

kompiuterinis programavimas terminas „gija“ yra trumpas vykdymo siūlas, kuriame procesorius eina nurodytu keliu per jūsų kodą. Koncepcija sekti daugiau nei vieną siūlą vienu metu supažindina su daugelio užduočių atlikimu ir daugybės sriegių tema.

Programoje yra vienas ar keli procesai. Pagalvokite apie procesą kaip apie programą, vykdomą jūsų kompiuteryje. Dabar kiekvienas procesas turi vieną ar daugiau gijų. Žaidimo programoje gali būti gija ištekliams iš disko įkelti, kita - AI, kita - paleisti žaidimą kaip serverį.

.NET / Windows operacinė sistema paskirsto procesoriaus laiką gijai. Kiekviena gija stebi išimtinius tvarkytojus ir prioritetą, kuriuo ji veikia, ir turi kur išsaugoti gijos kontekstą, kol ji vykdoma. Gijos kontekstas yra informacija, kurią reikia atnaujinti.

Kelių užduočių atlikimas siūlais

Siūlai užima šiek tiek atminties, o jų sukūrimas užtrunka šiek tiek laiko, todėl paprastai nenorite naudoti daug. Atminkite, kad jie konkuruoja dėl procesoriaus laiko. Jei jūsų kompiuteryje yra keli procesoriai, tada „Windows“ ar .NET gali paleisti kiekvieną giją kitame procesoriuje, bet jei tuo pačiu procesoriumi veikia kelios gijos, tada vienu metu gali būti aktyvus tik vienas, o gijų perjungimas užtruks laikas.

instagram viewer

Centrinis procesorius paleidžia giją keliems milijonams instrukcijų, o tada perjungia į kitą giją. Visi centrinio procesoriaus registrai, dabartinis programos vykdymo taškas ir pluoštas turi būti kažkur išsaugoti pirmajam gijui, o paskui iš kažkur atkurti kitam gijui.

Gijos sukūrimas

Vardų erdvės sistemoje. Sriegimas, rasite siūlų tipą. Konstruktoriaus sriegis („ThreadStart“) sukuria gijos egzempliorių. Tačiau pastaruoju metu C # kodą, greičiausiai praeis lambda išraiška, vadinanti metodą bet kokiais parametrais.

Jei abejojate lambda išraiškos, galbūt verta patikrinti LINQ.

Čia yra sukurto ir pradėto gijos pavyzdys:

naudojant sistemą;
naudojant sistemą. Sriegimas;
vardų sritis ex1
{
klasės programa
{
public static void Write1 ()
{
Konsolė. Rašyti ('1');
Siūlas. Miegas (500);
}
static void Main (eilutė [] args)
{
var užduotis = nauja gija (Write1);
užduotis. Pradėti ();
už (var i = 0; i <10; aš ++)
{
Konsolė. Rašyti ('0');
Konsolė. Rašyti (užduotis. Gyvas? 'REKLAMA') ;
Siūlas. Miegas (150);
}
Konsolė. ReadKey ();
}
}
}

Visas šis pavyzdys yra „1“ įrašymas į konsolę. Pagrindinis sriegis 10 kartų rašo „0“ prie konsolės, kiekvieną kartą eidamas „A“ arba „D“, atsižvelgiant į tai, ar kitas sriegis vis dar gyvas, ar negyvas.

Kita gija eina tik vieną kartą ir rašo „1.“ Po pusės sekundės atidėjimo „Write1“ () gijoje sriegis baigiasi ir užduotis. „IsAlive“ pagrindinėje kilpoje dabar grąžina „D.“

Sriegių fondas ir užduočių lygiagreti biblioteka

Užuot sukūrę savo giją, nebent jums to tikrai reikia padaryti, pasinaudokite sriegių fondu. Iš .NET 4.0 turime prieigą prie užduočių paralelinės bibliotekos (TPL). Kaip ir ankstesniame pavyzdyje, vėlgi mums reikia šiek tiek LINQ, ir taip, visa tai yra lambda išraiškos.

Užduotys naudoja Sriegių baseinas užkulisiuose, tačiau geriau naudokite gijas, atsižvelgiant į naudojamą skaičių.

Pagrindinis TPL objektas yra užduotis. Tai klasė, vaizduojanti asinchroninę operaciją. Dažniausias būdas pradėti viską vykdyti yra užduotis. Gamykla. PradėtiNaujiena kaip:

Užduotis. Gamykla. StartNew (() => DoSomething ());

Kur „DoSomething“ () yra vykdomas metodas. Galima sukurti užduotį ir jos nedaryti iškart. Tokiu atveju tiesiog naudokite užduotį:

var t = nauja užduotis (() => konsolė. „WriteLine“ („Sveiki“));
...
t. Pradėti ();

Tai neprasideda, kol nebus iškviestas .Start (). Žemiau pateiktame pavyzdyje yra penkios užduotys.

naudojant sistemą;
naudojant sistemą. Sriegimas;
naudojant sistemą. Sriegimas. Užduotys;
vardų sritis ex1
{
klasės programa
{
public static void Write1 (int i)
{
Konsolė. Rašyti (i);
Siūlas. Miegas (50);
}
static void Main (eilutė [] args)
{
už (var i = 0; i <5; aš ++)
{
var reikšmė = i;
var runTask = Užduotis. Gamykla. StartNew (() => Write1 (reikšmė));
}
Konsolė. ReadKey ();
}
}
}

Vykdykite tai ir gausite skaitmenis nuo 0 iki 4 išvestimi atsitiktine tvarka, pavyzdžiui, 03214. Taip yra todėl, kad užduoties vykdymo tvarką nustato .NET.

Jums gali kilti klausimas, kodėl reikalinga var value = i. Pabandykite jį pašalinti ir paskambinkite „Write (i)“, pamatysite ką nors netikėto, pvz., 55555. Kodėl tai? Taip yra todėl, kad užduotis rodo i vertę tuo metu, kai užduotis vykdoma, o ne tada, kai užduotis buvo sukurta. Kurdamas naują kintamasis kiekvieną kartą kilpoje kiekviena iš penkių verčių yra teisingai saugoma ir paimama.

instagram story viewer