Вступ до багатопотокової роботи в C #

Щоб зрозуміти багатопоточність у c #, давайте спочатку зрозуміємо, що таке нитка?

  • Нитка - це процес легкої ваги.
  • Це шлях виконання програми.
  • Це найменша одиниця обробки в операційній системі.
  • Таким чином, процес може мати декілька потоків.

Отже, багатопотокове читання - це процес, який містить декілька потоків, де кожна нитка виконує різну активність. Це економить час, оскільки кілька завдань виконуються одночасно різними потоками. Це збільшує використання процесора та підвищує ефективність програми. Це працює над концепцією розподілу часу.

Синтаксис із поясненням

Thread first_thread_name = new Thread(new ThreadStart(method_to_be_executed1));
Thread second_thread_name = new Thread(new ThreadStart(method_to_be_executed2));
first_thread_name.Start();
second_thread_name.Start();

Для створення потоку нам потрібно створити об’єкт класу Thread. Конструктор класу Thread посилається на ThreadStart. ThreadStart - це делегат, який представляє метод, який потрібно виконати, коли потік починає виконання.

Потік починає виконання, коли викликається метод Start ().

Ми можемо створити потік без використання делегата ThreadStart, як показано нижче в синтаксисі:

Thread thread_name = new Thread(method_to_be_executed);
thread_name.Start();

Створення декількох ниток у C #

Для того, щоб створити нитки, нам потрібно імпортувати system.Threading простір імен. Ми можемо створити та ініціалізувати теми за допомогою класу Thread.

Приклад використання класу Thread

using System;
using System.Threading;
public class MultiThreadingDemo
(
public static void Method1()
(
for (int i = 0; i <= 5; i++)
(
Console.WriteLine("Method1 : (0)", i);
)
)
public static void Method2()
(
for (int i = 0; i <= 5; i++)
(
Console.WriteLine("Method2 : (0)", i);
)
)
public static void Main()
(
// Creating and initializing threads
Thread thread1 = new Thread(Method1);
Thread thread2 = new Thread(Method2);
//beginning thread execution
thread1.Start();
thread2.Start();
)
)

Вихід:

Приклад з використанням делегата ThreadStart

using System;
using System.Threading;
public class MultiThreading
(
public static void Method1()
(
for (int i = 1; i <= 5; i++)
(
Console.WriteLine("Method1 : (0)", i);
)
)
public static void Method2()
(
for (int i = 1; i <= 5; i++)
(
Console.WriteLine("Method2 : (0)", i);
)
)
)
public class MultithreadingDemo
(
public static void Main()
(
Thread thread1 = new Thread(new ThreadStart(MultiThreading.Method1 ) );
Thread thread2 = new Thread(new ThreadStart(MultiThreading.Method2 ) );
thread1.Start();
thread2.Start();
)
)

Вихід:

Примітка. Не обов'язково, щоб методи, які використовуються в багатопотоковому читанні, були статичними, як у вищезгаданих двох прикладах, обидва методи, тобто метод1 та метод2, є статичними. Ці методи можуть бути нестатичними, і в цьому випадку спочатку нам потрібно створити об'єкт класу, що містить методи, а потім отримати доступ до методів за допомогою об'єкта.

У програмі C # програма завжди містить один потік, тобто головну нитку. Коли ми створюємо інші потоки, вона стає багатопотоковою програмою, а в C # багатопотоковому потоці є два типи потоків:

  • Нитка переднього плану : ця нитка продовжує виконуватись, поки не закінчить свою роботу, навіть якщо основна нитка закінчується.
  • Фонова нитка : Коли закінчується основна нитка, фонова нитка також припиняє виконання і закінчується основною ниткою.

Методи з прикладами

Давайте подивимося на деяких часто використовуваних методах класу Thread з прикладами.

  • Sleep (): використовується для призупинення виконання поточного потоку протягом визначеного періоду часу, щоб інші потоки почали виконання.

Приклад:

using System;
using System.Threading;
public class Multithreading
(
public void Display()
(
for (int i = 1; i <= 10; i++)
(
Console.WriteLine(i);
//suspending execution of current thread for 100 milliseconds
Thread.Sleep(100);
)
)
)
public class MultithreadingDemo
(
public static void Main()
(
Multithreading multithreading = new Multithreading();
Thread thread1 = new Thread(new ThreadStart(multithreading.Display));
Thread thread2 = new Thread(new ThreadStart(multithreading.Display));
thread1.Start();
thread2.Start();
)
)

Вихід:

Вихід показує, що обидва потоки виконані паралельно.

  • Abort (): використовується для завершення потоку або ми можемо сказати, що він використовується для припинення виконання потоку назавжди.

Приклад

using System;
using System.Threading;
public class Multithreading
(
public void Display()
(
for (int i = 0; i < 10; i++)
(
Console.WriteLine(i);
Thread.Sleep(100);
)
)
)
public class MultithreadingDemo
(
public static void Main()
(
Multithreading multithreading = new Multithreading();
Thread thread1 = new Thread(new ThreadStart(multithreading.Display));
Thread thread2 = new Thread(new ThreadStart(multithreading.Display));
Console.WriteLine("Threads start execution");
thread1.Start();
thread2.Start();
try
(
//terminating execution of thread using Abort()
thread1.Abort();
thread2.Abort();
Console.WriteLine("Threads execution terminated");
)
catch (ThreadAbortException threadAbortException)
(
Console.WriteLine(threadAbortException.ToString());
)
)
)

Вихід:

  • Join (): використовується для того, щоб усі потоки виклику чекали, поки поточний потік завершить його виконання та завершиться.

Приклад:

using System;
using System.Threading;
public class Multithreading
(
public void Display()
(
for (int i = 0; i < 5; i++)
(
Thread thread = Thread.CurrentThread;
Console.WriteLine(thread.Name +" : "+i);
Thread.Sleep(100);
)
)
)
public class MultithreadingDemo
(
public static void Main()
(
Multithreading multithreading = new Multithreading();
Thread thread1 = new Thread(new ThreadStart(multithreading.Display));
Thread thread2 = new Thread(new ThreadStart(multithreading.Display));
Thread thread3 = new Thread(new ThreadStart(multithreading.Display));
//Assigning names to threads using Name property
thread1.Name = "Thread1";
thread2.Name = "Thread2";
thread3.Name = "Thread3";
thread1.Start();
//Making Thread2 and Thread3 wait until Thread1 completes execution
thread1.Join();
thread2.Start();
thread3.Start();
)
)

Вихід:

Переваги багатопотокової роботи в C #

  1. Допомагає підтримувати чуйний користувальницький інтерфейс. Іноді у нашому застосуванні є трудомісткий метод. У такому випадку, якщо ми робимо нашу програму багатопоточною, тоді інша нитка несе відповідальність за виконання цього методу, тоді як Головна нитка може зосередитись на чутливості програми. Таким чином, він не заморозить наш додаток, вчасно надавши належну відповідь користувачеві.
  2. Підвищує продуктивність програми: Якщо у нас стільки потоків, скільки є процесорних ядер, то кожен потік буде працювати незалежно, збільшуючи кількість обчислень за секунду.
  3. Нитки мінімізують використання системних ресурсів, оскільки вони мають однаковий адресний простір.
  4. Це робить код одночасно швидшим і простішим.

Висновок - багатопотоковість в C #

Клас теми забезпечує багато важливих властивостей, таких як Priority, Name, IsAlive, фон, який ми можемо використовувати в нашому багатопотоковому додатку. Синхронізація потоків - це техніка, за допомогою якої нитка може отримати доступ до ресурсу протягом певного часу без переривання інших потоків, поки не виконає своє завдання.

Рекомендовані статті

Це було керівництвом щодо багатопотокової роботи в C #. Тут ми також обговорюємо їх вступ, синтаксис, створення та приклади багатопотокових читань у c #. Ви також можете переглянути наступні статті, щоб дізнатися більше -

  1. Об'єкти в C #
  2. Деструктор в C #
  3. Деструктор в C #
  4. Спадщина в C #
  5. Деструктор в PHP | Приклади