Uvod:
Asinkrono programiranje postalo je popularan trend u modernom razvoju softvera. Dvije najčešće korištene tehnike za asinkrono programiranje u C# su Zadaci i niti . Međutim, mnogi programeri su zbunjeni razlikama između Zadaci i niti i kada koristiti svaku od njih. U ovom ćemo članku vidjeti prisutne razlike između Zadaci i niti u C# i dati smjernice kada koristiti svaki od njih.
Što su Zadaci?
U C#, zadatak je apstrakcija više razine za asinkrono izvođenje koda. Zadatak označava radnu jedinicu koja se mora izvršiti asinkrono i može, ali i ne mora vratiti vrijednost. Zadatak se obično kreira uz pomoć Klasa Tvornica zadataka , koji nudi nekoliko metoda za stvaranje i izvršavanje zadataka.
Zadaci koriste a Bazen niti da izvrše svoj posao, što znači da se zadaci izvršavaju na jednoj od niti u Bazen niti. Kada se zadatak izradi, dodaje se u Red čekanja skupa niti , a jedna od niti u skupu koristi se za izvršenje zadatka. Nakon što je Zadatak dovršen, Thread se vraća u spremište, spreman za korištenje za drugi Zadatak.
Zadaci imaju nekoliko prednosti u odnosu na Threads:
- Zadaci su lakši od niti. Zadaci koriste manje resursa sustava, kao što su memorija i CPU vrijeme, u usporedbi s nitima.
- Zadacima je lakše upravljati nego nitima. Zadaci pružaju apstrakciju više razine za asinkrono programiranje, što olakšava pisanje i održavanje koda.
- Zadaci također mogu pružiti bolje performanse od niti u određenim situacijama. To je zato što Zadaci koriste a Bazen niti , koji može upravljati nitima učinkovitije od stvaranja i uništavanja niti za svaku jedinicu rada.
Što su niti?
U C#, Thread je apstrakcija niže razine za asinkrono izvođenje koda. Nit predstavlja konstrukciju na razini operativnog sustava koja se koristi za asinkrono izvršavanje koda. Nit može, ali ne mora vratiti vrijednost, a obično se stvara uz pomoć Klasa niti .
Niti koriste vlastite resurse, kao što su memorija i CPU vrijeme, a obično ih izričito stvara i uništava programer. Kada se Thread kreira, odmah se počinje izvršavati i nastavlja se izvršavati dok se eksplicitno ne zaustavi ili dok ne završi svoj rad.
Niti imaju nekoliko nedostataka u usporedbi sa zadacima:
- Niti su teže od zadataka. Niti koriste više resursa sustava, kao što su memorija i CPU vrijeme, u usporedbi sa zadacima.
- Nitima je teže upravljati nego Zadacima. Niti zahtijevaju više niže razine programiranja i sinkronizacije, što otežava pisanje i održavanje koda.
- Niti također mogu dati lošiju izvedbu od zadataka u određenim situacijama. To je zato što stvaranje i uništavanje niti za svaku jedinicu rada može biti neučinkovito, posebno kada postoji mnogo jedinica rada za izvršenje.
Kada koristiti Zadatke:
Zadaci se preporučuju kada želite izvršiti jedinicu rada asinkrono, a ne trebate finu kontrolu nad izvršenjem. Zadaci su savršeni za izvršavanje malih i kratkotrajnih jedinica rada, kao što su I/O operacije ili jednostavna izračunavanja.
Zadaci se također preporučuju kada želite iskoristiti prednosti a Bazen niti . A Bazen niti može upravljati nitima učinkovitije od stvaranja i uništavanja niti za svaku jedinicu rada. To može rezultirati boljom izvedbom, posebno kada postoji mnogo jedinica rada koje treba izvršiti.
Zadaci su također korisni kada želite ulančati asinkrone operacije. Zadaci se mogu kombinirati pomoću operatora čekanja za stvaranje lanca asinkronih operacija koje se izvršavaju jedna za drugom. Ovo može biti važno kada želite izvesti niz ovisnih asinkronih operacija.
Kada koristiti niti:
Niti u C# bi se trebale koristiti kada vam je potrebna precizna kontrola nad izvođenjem i kada imate specifične zahtjeve koji se ne mogu ispuniti s apstrakcijama više razine koje pružaju Zadaci. Evo nekih situacija u kojima Threads mogu biti bolji izbor:
Dugotrajne jedinice rada:
Niti su prikladnije za dugotrajne jedinice rada, kao što su pozadinske usluge ili složena izračunavanja koja zahtijevaju veću kontrolu nad izvođenjem. U takvim slučajevima često je potrebno kontrolirati izvršenje koda na detaljniji način od onoga što Zadaci pružaju.
Fino zrnata kontrola nad izvođenjem niti:
Teme vam omogućuju postavljanje Prioriteti niti, sinkronizacija niti , i Nit se prekida . Ako trebate prilagoditi način na koji se vaš kod izvršava, Threads nudi sučelje niske razine koje vam to omogućuje.
Programiranje niske razine:
veličine žličice
Niti zahtijevaju više programiranja niže razine i sinkronizacije, što može biti korisno ako imate specijalizirane zahtjeve koji se ne mogu ispuniti s apstrakcijama više razine koje pružaju Zadaci.
Interakcija s neupravljanim kodom:
Ako trebate interoperirati s neupravljanim kodom, niti mogu biti jedina opcija. U takvim slučajevima, možda ćete morati ručno kreirati i kontrolirati Threads kako biste bili sigurni da vaš kod ispravno radi s neupravljanim kodom.
Razmatranja izvedbe:
U nekim situacijama, stvaranje i uništavanje niti za svaku jedinicu rada može biti neučinkovito, posebno kada postoji mnogo jedinica rada za izvršenje. U takvim slučajevima korištenje niti može biti bolja opcija jer se mogu ponovno koristiti za više jedinica rada.