MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Crearea thread-urilor - Delegatul ThreadStart

Limbajul C# permite rularea și executarea în cadrul aplicației a mai multor thread-uri care se vor executa simultan.

Pentru crearea unui thread se folosește unul dintre constructorii clasei Thread:

  • Thread(ThreadStart): ca parametru primește un obiect de delegat ThreadStart, care reprezintă acțiunea ce va fi executată în thread
  • Thread(ThreadStart, Int32): în plus față de delegatul ThreadStart, primește o valoare numerică ce stabilește dimensiunea stivei alocate pentru acest thread
  • Thread(ParameterizedThreadStart): ca parametru primește un obiect de delegat ParameterizedThreadStart, care reprezintă acțiunea ce va fi executată în thread
  • Thread(ParameterizedThreadStart, Int32): împreună cu delegatul ParameterizedThreadStart, primește o valoare numerică ce stabilește dimensiunea stivei pentru acest thread

Indiferent de constructorul folosit pentru creare, trebuie să definim acțiunea ce va fi executată în thread. În acest articol, vom examina utilizarea delegatului ThreadStart. Acest delegat reprezintă o acțiune care nu primește niciun parametru și nu returnează nicio valoare:

public delegate void ThreadStart();

Adică, pentru acest delegat, trebuie să definim o metodă de tip void care nu primește niciun parametru. Exemple de definire a thread-urilor:

Thread myThread1 = new Thread(Print);
Thread myThread2 = new Thread(new ThreadStart(Print));
Thread myThread3 = new Thread(()=>Console.WriteLine("Hello Threads"));

void Print() => Console.WriteLine("Hello Threads");

Pentru a porni un nou thread, se folosește metoda Start a clasei Thread:

using System.Threading;

// creăm un nou thread
Thread myThread1 = new Thread(Print);
Thread myThread2 = new Thread(new ThreadStart(Print));
Thread myThread3 = new Thread(()=>Console.WriteLine("Hello Threads"));

myThread1.Start();  // pornim thread-ul myThread1
myThread2.Start();  // pornim thread-ul myThread2
myThread3.Start();  // pornim thread-ul myThread3

void Print() => Console.WriteLine("Hello Threads");

Avantajul thread-urilor este că ele pot fi executate simultan. De exemplu:

using System.Threading;

// creăm un nou thread
Thread myThread = new Thread(Print);
// pornim thread-ul myThread
myThread.Start();

// acțiuni executate în thread-ul principal
for (int i = 0; i < 5; i++)
{
   Console.WriteLine($"Thread-ul principal: {i}");
   Thread.Sleep(300);
}

// acțiuni executate în al doilea thread
void Print()
{
   for (int i = 0; i < 5; i++)
   {
       Console.WriteLine($"Al doilea thread: {i}");
       Thread.Sleep(400);
   }
}

Aici, noul thread va executa acțiunile definite în metoda Print, adică va afișa pe consolă numerele de la 0 la 4. După fiecare afișare, se va produce o întârziere de 400 milisecunde.

În thread-ul principal - în metoda Main - creăm și pornim un nou thread în care se execută metoda Print:

Thread myThread = new Thread(Print);
myThread.Start();

În plus, în thread-ul principal, efectuăm acțiuni similare - afișăm pe consolă numerele de la 0 la 4 cu o întârziere de 300 milisecunde.

Astfel, în programul nostru, vor rula simultan thread-ul principal, reprezentat de metoda Main, și al doilea thread, în care se execută metoda Print. De îndată ce toate thread-urile își vor încheia execuția, programul se va încheia. În final, vom obține următoarea ieșire pe consolă:

Thread-ul principal: 0
Al doilea thread: 0
Thread-ul principal: 1
Al doilea thread: 1
Thread-ul principal: 2
Al doilea thread: 2
Thread-ul principal: 3
Al doilea thread: 3
Thread-ul principal: 4
Al doilea thread: 4

În mod similar, putem crea și porni trei, patru sau un set întreg de noi thread-uri care vor putea rezolva diverse sarcini.

← Lecția anterioară Lecția următoare →