Ohjelmointi

Ymmärtäminen langan altaat C #

Lanka on prosessin pienin toteutusyksikkö. Langankeräin koostuu useista säikeistä tai tarkasta langankokoelmasta, ja sitä voidaan käyttää useiden toimintojen suorittamiseen taustalla.

Miksi minun pitäisi käyttää langankierteitä?

Viestiketjut ovat kalliita, koska ne kuluttavat paljon resursseja järjestelmässäsi alustamiseen, kontekstien vaihtamiseen ja käyttämiensä resurssien vapauttamiseen. Normaalisti, kun säie suorittaa I / O-operaatiota (tiedostojen käsittely, tietokantatoiminto tai verkon resurssien käyttö jne.), Käyttöjärjestelmä estää langan, kunnes I / O-toiminto on valmis. Lanka jatkaa CPU-toimintaansa, kun I / O-toiminto on valmis.

Lank pooli on hyvä valinta, kun haluat rajoittaa tietyllä hetkellä käynnissä olevien ketjujen määrää ja haluat välttää ketjujen luomisen ja tuhoamisen sovelluksessasi. Se on myös hyvä valinta, kun sovelluksessasi on monia tehtäviä, jotka on suoritettava joko rinnakkain tai samanaikaisesti, ja haluat parantaa sovelluksen reagointikykyä välttämällä kontekstikytkimiä. Voit luoda ketjujoukon hyödyntämällä System.Threading.ThreadPool-luokkaa.

Seuraava koodinpätkä osoittaa, kuinka voit asettaa säikeiden vähimmäismäärän ketjujoukossa.

ThreadPool.SetMinThreads (50, 50);

Huomaa kuitenkin, että kun pitkään käynnissä oleva tehtävä on käynnissä, säiealan säie voi olla estetty pitkäksi aikaa. Mikä pahempaa, saapuvat pyynnöt, jotka riippuvat ketjujoukon säikeistä, voivat olla odotustilassa tai jopa hylätä, koska säiealueella ei ehkä ole käytettävissä olevia ketjuja saapuvan pyynnön käsittelemiseksi. Langankierre ei myöskään ole hyvä valinta, kun sinulla on säikeitä, jotka eroavat prioriteeteistaan ​​tai joudut ehkä keskeyttämään langan ennenaikaisesti. Kierteen ennenaikainen lopettaminen tarkoittaa, että lanka on pysäytetty voimakkaasti ennen kuin sen kierrosaika on ohi.

Kuinka langankierre toimii?

Pohjimmiltaan, työskennellessäsi säiealueiden kanssa, luodaan tyypillisesti kokoelma säikeitä ja tallennetaan ne säiealueeseen ennen kuin ketjut käytetään sovelluksessasi. Kun tarvitset ketjua, käytät niitä uudelleen sen sijaan, että luot uusia ketjuja aina, kun sovelluksen on käytettävä ketjua.

Joten, sovellus pyytäisi ketjujoukkoa hankkimaan säiettä siitä, suorittamaan toimintoja langan avulla ja palauttamaan sitten langan takaisin säiejoukkoon, kun se on valmis. Keskusteluryhmät ovat hyödyllisiä tilanteissa, joissa sinulla on enemmän suoritettavia tehtäviä kuin mitä voit luoda ketjuista (prosessia kohti luotavien ketjujen enimmäismäärälle on rajoitettu) sovelluksessasi.

Kuinka voin optimoida langankierteen?

Kun prosessi alkaa, CLR allokoi sille ketjujoukon. Huomaa, että voit määrittää ketjupoolin koon tarvittaessa. Ajonaika hallitsee langankeräystä älykkäästi. Kun lanka-allas alkaa, lanka-altaassa on vain yksi lanka. Siitä lähtien säiepoolin hallinta (komponentti, joka on vastuussa lanka-altaan hallinnasta) luo lisää säikeitä ja tallentaa ne säiejoukkoon, kun sovelluksen kuormitus kasvaa, eli sovellus tarvitsee yhä enemmän tehtäviä suoritettavaksi samanaikaisesti.

Langankierrossa käytettävissä olevien säikeiden lukumäärää tiettynä ajankohtana säätelee langankierteen suurin sallittu kierteiden raja. Toisin sanoen käytettävissä olevien säikeiden määrä säiealueessa vaihtelee ajoittain riippuen sovelluksen kuluttamista säikeistä. Heti kun enimmäisraja (ketjujen enimmäismäärä säikeessä) on saavutettu, sovellus luo uusia säikeitä paljon harvemmin.

Voit aina asettaa langankierteen sallitun langan ylärajan tarvittaessa itse. Tätä varten sinun tulisi hyödyntää ThreadPool.SetMaxThreads-ominaisuutta. Jos haluat asettaa säikeiden alarajan säiejoukossa, voit käyttää ThreadPool.SetMinThreads-ominaisuutta. Oletusarvoinen langankierron lukumäärän alaraja on yksi ketju prosessoria kohden.