Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Многопоточность в C#: Повышение производительности и эффективности

Что такое поток

Поток (thread) — это путь выполнения программы. Каждый поток определяет уникальный поток управления. Если приложение выполняет сложные и длительные операции, полезно разделить выполнение на несколько потоков, каждый из которых выполняет свою задачу.

Потоки — это легковесные процессы. Классический пример — реализация параллельного программирования современными ОС. Использование потоков экономит такты процессора и повышает эффективность приложения.

До сих пор мы писали программы с одним потоком — единственным процессом приложения. Так приложение может выполнять только одну задачу за раз. Чтобы выполнять несколько задач одновременно, её делят на более мелкие потоки.

Жизненный цикл потока

Жизненный цикл начинается при создании объекта System.Threading.Thread и заканчивается при завершении или прерывании потока.

Основные состояния:

Главный поток

В C# для работы с потоками используется класс System.Threading.Thread. Он позволяет создавать и управлять отдельными потоками. Первый поток в процессе называется главным (main thread).

При запуске программы главный поток создаётся автоматически. Потоки, созданные через класс Thread, называются дочерними. Доступ к текущему потоку предоставляет свойство CurrentThread.

Пример работы с главным потоком:

Live Demo
using System;
using System.Threading;
namespace MultithreadingApplication {
    class MainThreadProgram {
        static void Main(string[] args) {
            Thread th = Thread.CurrentThread;
            th.Name = "MainThread";
            Console.WriteLine("This is {0}", th.Name);
            Console.ReadKey();
        }
    }
}

Результат:

This is MainThread

Свойства и методы класса Thread

Наиболее часто используемые свойства:

№Свойство и описание
1CurrentContext — текущий контекст выполнения потока.
2CurrentCulture — культура текущего потока.
3CurrentPrincipal — текущий участник для ролевой безопасности.
4CurrentThread — текущий выполняющийся поток.
5CurrentUICulture — культура для Resource Manager.
6ExecutionContext — информация о контекстах потока.
7IsAlive — статус выполнения потока.
8IsBackground — является ли поток фоновым.
9IsThreadPoolThread — принадлежит ли поток пулу.
10ManagedThreadId — уникальный идентификатор управляемого потока.
11Name — имя потока.
12Priority — приоритет планирования.
13ThreadState — состояния потока.

Наиболее часто используемые методы:

№Метод и описание
1Abort() — начинает процесс завершения потока через ThreadAbortException.
2Start() — запускает поток.
3Sleep(ms) — приостанавливает поток на указанное время.
4Join() — блокирует вызывающий поток до завершения данного.
5Interrupt() — прерывает поток в состоянии WaitSleepJoin.
6ResetAbort() — отменяет запрос Abort.
7VolatileRead/Write — чтение/запись с гарантией видимости для всех процессоров.
8MemoryBarrier() — синхронизация доступа к памяти.
9Yield() — передаёт управление другому готовому потоку.

Создание потоков

Потоки создаются через класс Thread. Расширенный класс вызывает Start() для запуска дочернего потока.

Live Demo
using System;
using System.Threading;
namespace MultithreadingApplication {
    class ThreadCreationProgram {
        public static void CallToChildThread() {
            Console.WriteLine("Child thread starts");
        }
        static void Main(string[] args) {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}

Результат:

In Main: Creating the Child thread
Child thread starts

Управление потоками

Класс Thread предоставляет методы управления. Пример использования Sleep() для паузы:

Live Demo
using System;
using System.Threading;
namespace MultithreadingApplication {
    class ThreadCreationProgram {
        public static void CallToChildThread() {
            Console.WriteLine("Child thread starts");
            int sleepfor = 5000;
            Console.WriteLine("Child Thread Paused for {0} seconds", sleepfor / 1000);
            Thread.Sleep(sleepfor);
            Console.WriteLine("Child thread resumes");
        }
        static void Main(string[] args) {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}

Результат:

In Main: Creating the Child thread
Child thread starts
Child Thread Paused for 5 seconds
Child thread resumes

Уничтожение потоков

Метод Abort() используется для завершения потоков. Среда выполнения выбрасывает ThreadAbortException. Это исключение нельзя перехватить, управление передаётся в блок finally (если есть).

Live Demo
using System;
using System.Threading;
namespace MultithreadingApplication {
    class ThreadCreationProgram {
        public static void CallToChildThread() {
            try {
                Console.WriteLine("Child thread starts");
                for (int counter = 0; counter <= 10; counter++) {
                    Thread.Sleep(500);
                    Console.WriteLine(counter);
                }
                Console.WriteLine("Child Thread Completed");
            } catch (ThreadAbortException e) {
                Console.WriteLine("Thread Abort Exception");
            } finally {
                Console.WriteLine("Couldn't catch the Thread Exception");
            }
        }
        static void Main(string[] args) {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Thread.Sleep(2000);
            Console.WriteLine("In Main: Aborting the Child thread");
            childThread.Abort();
            Console.ReadKey();
        }
    }
}

Результат (может варьироваться):

In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception

Язык C

  1. Малая vs большая диаметры резьбы: как выбрать правильный размер винта
  2. Нить: виды, история, производство и контроль качества
  3. Thread vs ZigBee: техническое сравнение для IoT-инженеров
  4. Выбор правильной нитевой обработки: Повышение надежности и сокращение простоя
  5. Освоение многопоточности в C++: эффективное параллельное программирование
  6. Многопоточное программирование в Python: эффективные техники параллелизма
  7. Периферийные вычисления получают четкий, отраслево одобренный фреймворк
  8. Быстрая обратная засветка: съемка более 1 миллиона кадров в секунду
  9. Распутывание цифровой нити: план Siemens PLM для умного производства
  10. Понимание резаков нитей: типы, использование и применения