Programavimas

Suprasti siūlų telkinius C #

Gija yra mažiausias proceso vykdymo vienetas. Siūlų grupę sudaro keli siūlai arba tiksliau siūlų rinkinys, ir jis gali būti naudojamas kelioms veikloms atlikti fone.

Kodėl turėčiau naudoti siūlų baseinus?

Siūlai yra brangūs, nes jie sunaudoja daug išteklių jūsų sistemoje, kad būtų galima inicijuoti, perjungti kontekstus ir išlaisvinti užimtus išteklius. Paprastai, kai gija atlieka įvesties / išvesties operaciją (failų tvarkymą, duomenų bazės veikimą arba prieigą prie tinklo išteklių ir kt.), Gija blokuojama operacinės sistemos, kol įvesties / išvesties operacija bus baigta. Gija atnaujins savo procesoriaus darbą, kai bus baigta jo įvesties / išvesties operacija.

Gijų rinkinys yra geras pasirinkimas, kai norite apriboti tam tikru laiko momentu vykdomų gijų skaičių ir norite išvengti papildomų gijų kūrimo ir naikinimo jūsų programoje. Tai taip pat geras pasirinkimas, kai programoje turite daug užduočių, kurias reikia atlikti lygiagrečiai arba vienu metu, ir norėtumėte pagerinti programos reagavimą, vengdami kontekstinių jungiklių. Norėdami sukurti gijų grupę, galite pasinaudoti „System.Threading.ThreadPool“ klase.

Šis kodo fragmentas rodo, kaip galite nustatyti mažiausią gijų skaičių gijų telkinyje.

„ThreadPool.SetMinThreads“ (50, 50);

Tačiau atkreipkite dėmesį, kad kai vykdoma ilgai vykdoma užduotis, gijų telkinio gija gali būti ilgą laiką užblokuota. Dar blogiau, kad gaunamos užklausos, kurios priklauso nuo gijų telkinio gijų, gali būti sulaikytos arba netgi atmestos visų pirma dėl to, kad gijų grupėje gali nebūti prieinamų gijų gaunamai užklausai tvarkyti. Gijų rinkinys taip pat nėra geras pasirinkimas, kai turite gijas, kurios skiriasi pagal prioritetus, arba jums gali tekti nutraukti giją anksčiau laiko. Ankstyvas gijos nutraukimas reiškia, kad gija buvo priverstinai sustabdyta dar nepasibaigus jos apyvartos laikui.

Kaip veikia siūlų baseinas?

Iš esmės, dirbdami su siūlų telkiniais, prieš kurdami siūlus savo programoje, paprastai sukursite gijų rinkinį ir laikysite juos gijų telkinyje. Kai jums reikalinga gija, šias gijas naudosite pakartotinai, o ne kursite naujas gijas kiekvieną kartą, kai programai reikės naudoti giją.

Taigi, programa teiks užklausą gijų grupei gauti iš jos giją, atliks veiksmus naudodama giją ir, kai baigs, grąžins giją atgal į gijų grupę. Gijų telkiniai yra naudingi tais atvejais, kai turite daugiau užduočių, kurias galite atlikti, nei galite sukurti gijas (yra maksimalaus siūlų, kuriuos galite sukurti vienam procesui, skaičiaus limitas) jūsų programoje.

Kaip galiu optimizuoti siūlų grupę?

Kai procesas prasideda, CLR jam paskirsto gijų grupę. Atminkite, kad prireikus galite sukonfigūruoti gijų telkinio dydį. Klaida protingai valdo siūlų grupę. Prasidėjus siūlų grupei, siūlų telkinyje yra tik vienas siūlas. Nuo tada gijų telkinių tvarkytuvė (komponentas, atsakingas už gijų telkinio valdymą) sukuria daugiau gijų ir jas saugo gijų telkinyje, kai didėja programos apkrova, t.y., programai reikia vis daugiau ir daugiau užduočių, kurias reikia atlikti vienu metu.

Siūlų skaičius, kurį bet kuriuo metu gali būti siūlų grupėje, reguliuoja didžiausia leistina siūlų grupėje siūlų grupė. Kitaip tariant, siūlomų grupių siūlomų siūlų skaičius laikas nuo laiko skiriasi, priklausomai nuo programos suvartotų siūlų. Kai tik pasiekiama maksimali riba (maksimalus gijų skaičius gijų telkinyje), programa sukuria naujas gijas daug rečiau.

Jei reikia, siūlų grupėje visada galite nustatyti viršutinę leistiną sriegių ribą. Norėdami tai padaryti, turėtumėte pasinaudoti ypatybe „ThreadPool.SetMaxThreads“. Norėdami nustatyti apatinę siūlų baseino gijų ribą, galite naudoti ypatybę ThreadPool.SetMinThreads. Numatytoji apatinė gijų skaičiaus riba grupėje yra viena gija vienam procesoriui.