Введение в многопоточность в 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();
)
)
Выход:
Примечание: не обязательно, чтобы методы, используемые в многопоточности, были статическими, как в двух приведенных выше примерах, оба метода, т.е. Method1 и Method2, являются статическими. Эти методы могут быть нестатическими, и в этом случае нам сначала нужно создать объект класса, содержащий методы, а затем получить доступ к методам с помощью объекта.В 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 #
- Помогает в поддержке адаптивного пользовательского интерфейса: иногда в нашем приложении используется трудоемкий метод. В этом случае, если мы сделаем наше приложение многопоточным, другой поток берет на себя ответственность за выполнение этого метода, в то время как основной поток может сосредоточиться на отзывчивости приложения. Таким образом, это не замораживает наше приложение, своевременно давая правильный ответ пользователю.
- Повышает производительность приложения: если у нас столько потоков, сколько имеется ядер процессора, то каждый поток будет работать независимо, увеличивая количество вычислений в секунду.
- Потоки минимизируют использование системных ресурсов, поскольку они совместно используют одно и то же адресное пространство.
- Это делает код быстрее и проще одновременно.
Вывод - многопоточность в C #
Класс Thread предоставляет множество важных свойств, таких как Priority, Name, IsAlive, background, которые мы можем использовать в нашем многопоточном приложении. Синхронизация потоков - это метод, с помощью которого поток может получить доступ к ресурсу в течение определенного времени без прерывания других потоков, пока не выполнит свою задачу.
Рекомендуемые статьи
Это было руководство по многопоточности в C #. Здесь мы также обсудим их введение, синтаксис, создание и примеры многопоточности в C #. Вы также можете взглянуть на следующие статьи, чтобы узнать больше:
- Объекты в C #
- Деструктор в C #
- Деструктор в C #
- Наследование в C #
- Деструктор в PHP | Примеры