1. Pogledajte video (na našem je jeziku ):

Za domaći zadatak uraditi program u kojem radi semafor, (koji radi kao semafor na ulici).

izazov: Da li možete da kreirate raskrsnicu?

---------------

Novo Gradivo:

Rad sa nitima - Thread i MULTITHREADING

2. Pogledajte kratak video:

3.  TEORIJA i objašnjenje:

Rad sa nitima u C# programskom jeziku


Skoro svaki korisnik PC računara kod svoje kuće koristi računar sa jednim CPU – Central Processing Unit – centralnim procesorom, koji u suštini obavlja samo jednu operaciju u datom vremenu. Zbog velike brzine procesora, mi često imamo utisak da na primer računar obavlja više poslova istovremeno kad otvorimo više aplikacija u Windows-u. Međutim, činjenica je dok se jedna operacija obavlja, druge čekaju. Na primer: kad vam se pojavi neki veliki bag u računaru, to često znači da se neka operacija na procesorskom nivou izvršava previše vremena ili se ne može izvršiti do kraja i zbog toga vam tada izgleda da vam je celi Windows smrznut i slika na monitoru ukočena, sve dok ne resetujete računar.


( Životni ciklus niti u C# programskom jeziku )

Da se ne bi stalno dešavalo da svaka aplikacija zamrzne celi Windows pri svakoj komplikaciji tokom rada, stvoren je koncept korišćenja niti. Svaka aplikacija u Windows-u pokreće svoj vlastiti proces koji je izolovan od drugih aplikacija. Znači, svaki proces pokreće vlastiti thread – nit; nit shvatite jednostavno kao virtualni CPU. Nit je sekvenca izvršavanja programa. Većina programa koje programirate u C# programskom jeziku ima jednu ulaznu tačku, to je metoda Main() i završava se povratkom iz metode. Međutim, ni jedan Internet pretraživač ne radi na taj način. Oni kao da izvršavaju više zadataka istovremeno. I vi ćete dolaziti u situacije u vašim programima da vam je potrebno da obavljate neke funkcije bar prividno istovremeno. Svaka nit u Windows-u ima svoje određeno vreme koje se meri u milisekundima i nakon tog perioda nit se pauzira i Windows se prebacuje na drugu nit. Takvo ponašanje zovemo Context Switching. Koristeći niti mi izvršavamo procese bez čekanja da se prethodni proces završi. Na taj način mi samo stvaramo iluziju da se izvršava više niti u isto vreme. Kod više procesorskih računara gde imamo više CPU, koristimo Parallelism – paralelizam; gde se niti izvršavaju paralelno na više različitih CPU. Na koje sve načine možete da izvršavate Multithreating – izvršavanje više niti; najbolje da vidite šta vam .Net Framework nudi.

Kako se kreira nit koristeći Thread klasu?


Da biste najjednostavnije manipulisali nitima koristite Thread klasu koja se nalazi u System.Threading imenskom prostoru. Instanca klase Thread predstavlja jednu nit; jednu sekvencu izvršavanja. Drugu nit možete da formirate tako što konkretizujete objekat niti. Klasa Thread vam jednostavno omogućava da kreirate nove niti, kontrolišete njihova svojstva i dobijate status niti. Opet treba da znate da niti treba da koristite samo ako imate dobar razlog za to. Pogledajte praktičan primer kako se pravi nit.


using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ThreadClass
{
    class Program
    {
        public static void ThreadMethod()
        {
            for (sbyte i = 1; i < 5; i++)
            {
                WriteLine($"A: {i + 1}");
                Thread.Sleep(0);
                
            }
        }

        static void Main(string[] args)
        {
            Thread t = new Thread(new ThreadStart(ThreadMethod));
            t.Start();

            for (sbyte i = 1; i < 5; i++)
            {
                WriteLine($"B: {i + 1}");
                Thread.Sleep(0);

            }

            t.Join();

            WriteLine(Environment.NewLine + "Press any key to continue...");
            ReadKey();

        }
    }
}

Da u navedenom primeru nismo koristili niti, prvo bi se izvršila petlja for iz ThraedMethod metode zatim for petlja iz Main metode. To znači, da bi petlja for iz Main metode morala da sačeka da se petlja for iz ThreadMethod metode završi do kraja. Zamislite da metoda ThreadMethod radi neki kompleksniji zadatak za koje je potrebno mnogo vremena. Celi vaš program bi morao da čeka da se metoda ThreadMethod završi da bi program nastavio sa radom. Za to vreme celi vaš program bi bio neupotrebljiv dok bi korisnik vašeg programa imao utisak da nešto nije u redu sa vašim programom. Upotrebom niti se jednostavno omogućava da se niti izvršavaju sinhronizovano. Prvo obratite pažnju kako se kreira nit. On zahteva kao argument da unesete metodu. Ako se pitate kako je to moguće, to je moguće zahvaljujući delegatima. Klasa System.Threading sadrži delegat koji omogućava da argument zahteva metodu. Kad ste kreirali nit, ona ništa ne radi sve dok ne pokrenete nit metodom Start(). Inače nit možete pokrenuti, suspendovati, nastaviti ili prekinuti. Zatim, pogledajte metodu Sleep(0). Nula je u ovom slučaju vreme u milisekundama. Navedena naredba obaveštava Windows da odmah pređe na sledeću nit bez čekanja, dok metoda Join() omogućava da nastavite obradu podataka kad nit bude uništena. Kad pokrenete navedeni kod, rezultat će biti sličan:

B: 1
A: 1
B: 2
A: 2
B: 3
A: 3
B: 4
A: 4
B: 5
A: 5

Kako navedeni program izgleda možete pogledati i na video-u:



( C# 6.0 Tutorial - Advanced - 6. Thread Class )

Kako da kreiram nit u background-u?

Postoje dve vrste niti, foreground thread – nit koja se izvršava u prvom planu i background thread -  nit koja se izvršava u pozadini. Mnogo je bitno znati razliku. Po defaultu sve niti se izvršavaju u prvom planu i to jednostavno znači da se vaša aplikacija ne može ugasiti dok se sve niti ne izvrše. Ukoliko ste kreirali nit koja radi u pozadini, vaša aplikacija se može ugasiti i ako nit nije izvršena. Da bi se vaša nit izvršavala u pozadini dovoljno je podesiti properti IsBackground na true pre pokretanja niti. Pogledajte sledeći program.

using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ThreadBackground
{
    class Program
    {
        public static void ThreadMethod()
        {
            for (sbyte i = 1; i < 5; i++)
            {
                WriteLine($"Process: {i + 1}");
                Thread.Sleep(1000);

            }
        }

        static void Main(string[] args)
        {
            Thread t = new Thread(new ThreadStart(ThreadMethod));
            t.IsBackground = true; // the application won't wait until the background threads are completed
            t.Start();

            // WriteLine(Environment.NewLine + "Press any key to continue..." + Environment.NewLine);
            // ReadKey();

        }
    }
}

Kad pokrenete navedeni kod, program će se pokrenuti i odmah zatvoriti dok će nit i posle zatvaranja aplikacije nastaviti da se izvršava. Kako navedeni program izgleda možete pogledati i na video-u:


( C# 6.0 Tutorial - Advanced - 7. Thread Background )

Izvor: https://www.manuelradovanovic.com/2016/04/rad-sa-nitima-u-c-programskom-jeziku.html


3. deo: Kako da se koristi

Backgroundworker

unutar .Net-a

(komponenta koja postoji u Toolbox-u)


Last modified: Monday, 8 March 2021, 5:36 PM