Ohjelmointi

Kuinka työskennellä langoilla C #

Lanka on prosessin pienin toteutusyksikkö. Monisäikeinen on kyky olla useita säikeitä muistissa tiettynä ajankohtana ja vaihtaa niiden välillä käsittelemään useita toimintoja samanaikaisesti. Microsoftin .Net Framework tarjoaa erinomaisen tuen ketjujen käsittelyyn.

Ohjelmointiketjut C #: ssä

Jos haluat työskennellä ketjujen kanssa, sinun on sisällytettävä System.Threading-nimitila sovellukseesi. Uuden ketjun luomiseksi sinun tulisi hyödyntää ThreadStart-edustajaa ja välittää viittaus menetelmään, jonka pitäisi suorittaa ketjussa. Huomaa, että edustaja on tyyppikohtainen toimintosoitin. Seuraava koodinpätkä osoittaa, kuinka voit luoda uuden säieobjektin tämän edustajan avulla.

 Kierre t = new Thread (uusi ThreadStart (MyThreadMethod)); 

Aloita äskettäin luotu ketju kutsumalla Käynnistä-menetelmä luomallasi säieobjektilla. Seuraava koodiluettelo kuvaa tätä. Huomaa, että MyThreadMethod-ketjutapa suoritetaan uudelle luotulle langalle (jota kutsutaan työlangaksi).

 staattinen void Main ()

        {

Kierre t = new Thread (uusi ThreadStart (MyThreadMethod));

t.Aloita ();

Konsoli.Lue ();

        }

staattinen void MyThreadMethod ()

        {

Console.WriteLine (“Hei maailma!”);

        }

Näytä ketjutilat C #: ssä

Muistilanka voi olla eri tilassa - keskeytetty, tausta, käynnissä, pysäytetty, keskeytetty, aloittamaton jne. Kierteen tilat on määritelty ThreadState-luettelossa, joka on käytettävissä System.Threading-nimiavaruudessa. Ellei aloitusmenetelmää kutsuta ketjussa, ketju on Aloittamaton-tilassa. Kun Käynnistä-menetelmä kutsutaan ketjuinstanssissa, ketjun tila muuttuu Aloittamaton-tilasta Käynnissä-tilaan.

Seuraava koodinpätkä osoittaa, kuinka voit näyttää ketjun tilan konsolissa.

 Kierre t = new Thread (uusi ThreadStart (MyThreadMethod));

t.Aloita ();

Console.WriteLine ("Viestiketjun tila on:" + t.ThreadState.ToString ());

Ohjaa etu- ja taustalankoja C #: ssä

Kierteet voivat toimia joko etualalla tai taustalla. Luomasi ketjut ovat etualan säikeitä. Yksi suurimmista eroista etualan ja taustalangan välillä on, että sovelluksesi elää vain niin kauan kuin yksi tai useampi etualan säie on käynnissä. Pohjimmiltaan etualan säikeet estävät sovelluksen lopettamisen. Sen sijaan taustalangat eivät pidä Common Language Runtime -ympäristöä hengissä.

Voit asettaa ketjun taustan tilan käyttämällä IsBackground-ominaisuutta. Tässä on esimerkki koodista, joka osoittaa, miten tämä voidaan saavuttaa.

 staattinen void Main ()

        {

Kierre t = new Thread (uusi ThreadStart (MyThreadMethod));

t.Aloita ();

t.IsBackground = tosi;

Console.WriteLine ("Viestiketjun taustan tila on:" + t.IsBackground.ToString ());

Konsoli.Lue ();

        }

Voit keskeyttää tai jatkaa ketjua kutsumalla säieobjektin Suspend () - ja Resume () -menetelmät. Huomaa, että voit jatkaa aiemmin keskeyttämääsi säiettä vain soittamalla keskeytys () -menetelmälle.

 Kierre t = new Thread (uusi ThreadStart (MyThreadMethod));

t.Aloita ();

t.Suspend (); // Keskeyttää äskettäin luodun säikeen

t.Jatka (); // Jatka keskeytettyä säiettä

On kuitenkin huomattava, että Thread.Suspend () ja Thread.Resume () -menetelmät ovat vanhentuneet. Käytä pikemminkin AutoResetEvent- ja EventWaitHandle-menetelmiä synkronoidaksesi ketjut.

Aseta langan prioriteetti C #: ssä

Voit hallita ketjun prioriteettia määrittääksesi prosessorin ajan suhteellisen osuuden, jonka ketju saa verrattuna muihin muistissa oleviin säikeisiin. Langan prioriteetti määritetään ThreadPriority-luettelossa. Mahdollisia arvoja ovat: Alin, Normaalin alapuolella, Normaali, Normaalin yläpuolella ja Korkein. Seuraava koodinpätkä kuvaa, kuinka voit määrittää kahden ketjun ketjuprioriteetit lankaobjektin Priority-ominaisuuden avulla.

 staattinen void Main ()

        {

Langankierre1 = uusi ketju (uusi ThreadStart (menetelmä1));

Langankierre2 = uusi ketju (uusi ThreadStart (menetelmä2));

thread1.Priority = ThreadPriority.Highest;

thread2.Priority = ThreadPriority.Lowest;

thread2.Start ();

kierre 1.Aloita ();

Konsoli.Lue ();

        }

staattinen void Menetelmä 1 ()

        {

(int i = 0; i <10; i ++)

            {

Console.WriteLine (“Ensimmäinen ketju:“ + i);

            }

        }

staattinen mitätön menetelmä 2 ()

        {

(int i = 0; i <10; i ++)

            {

Console.WriteLine (“Toinen säie:“ + i);

            }

        }

Kun suoritat yllä olevan koodinpätkän, huomaat, että ensimmäinen säie suorittaa suorituksensa toisen säikeen edessä, vaikka toinen säie aloitettiin ennen Main-menetelmän ensimmäistä säiettä.

Langat ovat kalliita. He kuluttavat paljon resursseja järjestelmässäsi alustamiseen, kontekstien vaihtamiseen ja kuluttamiensa resurssien vapauttamiseen. Siksi monisäikeisyyttä tulisi käyttää järkevästi ja vain silloin, kun sitä tarvitaan. Kun hyödynnät monisäikeisyyden hyödyntämistä, on aina suositeltavaa hyödyntää ketjujoukkoja, jotta voit luoda ja hallita säikeitä tarpeen mukaan ja parantaa sovelluksesi herkkyyttä.