Kako raditi s nitima u C #

Nit je najmanja izvršna jedinica u procesu. Multithreading je sposobnost da se u memoriji u isto vrijeme ima više niti i da se između njih prebacuje kako bi se istovremeno obrađivalo više operacija. Microsoftov .Net Framework pruža izvrsnu podršku za rad s nitima.

Programiranje niti u C #

Da biste radili s nitima, trebali biste u svoju aplikaciju uključiti prostor imena System.Threading. Da biste stvorili novu nit, trebali biste koristiti delegat ThreadStart i proslijediti referencu metodi koja bi se trebala izvršiti na niti. Imajte na umu da je delegat pokazivač funkcije koji je siguran za tip. Sljedeći isječak koda pokazuje kako pomoću ovog delegata možete stvoriti novi objekt niti.

 Tema t = nova nit (novi ThreadStart (MyThreadMethod)); 

Da biste pokrenuli novostvorenu nit, trebali biste pozvati metodu Start na objektu niti koji ste stvorili. Sljedeći popis kodova to ilustrira. Napominjemo da se metoda niti MyThreadMethod izvršava na novoj niti (koja se naziva radnička nit) koja je stvorena.

 statička praznina Glavna ()

        {

            Tema t = nova nit (novi ThreadStart (MyThreadMethod));

            t.Start ();           

            Console.Read ();

        }

        statička praznina MyThreadMethod ()

        {

            Console.WriteLine ("Pozdrav svijetu!");

        }

Prikaz stanja niti u C #

Nit u memoriji može biti u različitim stanjima - prekinuto, pozadinsko, pokrenuto, zaustavljeno, obustavljeno, nepokrenuto itd. Stanja niti definirana su u nabrajanju ThreadState dostupnom u imenskom prostoru System.Threading. Ako se metoda Start ne pozove na niti, nit je u stanju Unstarted. Kada se na instanci niti pozove metoda Start, stanje niti mijenja se iz Unstarted u Running.

Sljedeći isječak koda pokazuje kako možete prikazati stanje niti u konzoli.

 Tema t = nova nit (novi ThreadStart (MyThreadMethod));

t.Start ();

Console.WriteLine („Stanje niti je:„ + t.ThreadState.ToString ());

Kontrolirajte niti prvog i drugog plana u C #

Niti se mogu izvoditi ili u prvom planu ili u pozadini. Niti koje izričito izradite su niti u prvom planu. Jedna od glavnih razlika između niti u prednjem planu i niti u pozadini je ta što vaša aplikacija živi samo dok se izvodi jedna ili više niti u prvom planu. U osnovi niti u prvom planu sprječavaju ukidanje aplikacije. Suprotno tome, pozadinske niti ne održavaju životno okruženje Common Language Runtime.

Možete postaviti status pozadine niti pomoću svojstva IsBackground. Evo primjera koda koji pokazuje kako se to može postići.

 statička praznina Glavna ()

        {

            Tema t = nova nit (novi ThreadStart (MyThreadMethod));

            t.Start ();

            t.IsBackground = true;

            Console.WriteLine („Status pozadine niti je:“ + t.IsBackground.ToString ());

            Console.Read ();

        }

Možete suspendirati ili nastaviti nit pozivanjem metoda Suspend () i Resume () na objektu niti. Imajte na umu da nit koju ste prethodno obustavili možete nastaviti pozivanjem metode Suspend ().

 Tema t = nova nit (novi ThreadStart (MyThreadMethod));

t.Start ();

t.Suspend (); // Obustavlja novostvorenu nit

t.Resume (); // Nastavlja suspendirani konac

Međutim, valja napomenuti da su metode Thread.Suspend () i Thread.Resume () zastarjele. Umjesto da upotrebljavate metode AutoResetEvent i EventWaitHandle za sinkronizaciju aktivnosti koje uključuju niti.

Postavljanje prioriteta niti u C #

Možete kontrolirati prioritet niti da biste odredili relativni udio procesorskog vremena koje će nit dobiti u usporedbi s ostalim nitima koje se nalaze u memoriji. Prioritet niti definiran je u nabrajanju ThreadPriority. Moguće vrijednosti uključuju: Najnižu, Ispod normalne, Normalnu, Iznad normalne i najvišu. Sljedeći isječak koda ilustrira kako možete postaviti prioritete niti dvije niti pomoću svojstva Priority objekta niti.

 statička praznina Glavna ()

        {

            Thread thread1 = new Thread (new ThreadStart (Method1));

            Thread thread2 = new Thread (new ThreadStart (Method2));

            thread1.Priority = ThreadPriority.Highest;

            thread2.Priority = ThreadPriority.Lowest;

            nit2.Start ();

            nit1.Start ();

            Console.Read ();

        }

        static void Method1 ()

        {

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

            {

                Console.WriteLine (“Prva nit:“ + i);

            }

        }

        Metoda statičke praznine2 ()

        {

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

            {

                Console.WriteLine (“Druga nit:“ + i);

            }

        }

Kada izvršite gornji isječak koda, vidjet ćete da prva nit dovršava svoje izvršavanje ispred druge niti iako je druga nit pokrenuta prije prve niti u metodi Main.

Niti su skupe. Oni troše puno resursa u vašem sustavu za inicijalizaciju, prebacivanje konteksta i oslobađanje resursa koje troše. Slijedom toga, višenitnost treba koristiti razborito i samo kada je to potrebno. Kada iskoristite prednost multithreadinga, uvijek je poželjno iskoristiti spremišta niti za stvaranje i upravljanje nitima na zahtjev i poboljšanje odzivnosti vaše aplikacije.