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

С# — многопоточность

поток определяется как путь выполнения программы. Каждый поток определяет уникальный поток управления. Если ваше приложение включает в себя сложные и трудоемкие операции, часто бывает полезно задать разные пути выполнения или потоки, чтобы каждый поток выполнял определенную работу.

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

До сих пор мы писали программы, в которых один поток работает как один процесс, который является работающим экземпляром приложения. Однако таким образом приложение может выполнять одно задание за раз. Чтобы заставить его выполнять более одной задачи одновременно, его можно разделить на более мелкие потоки.

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

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

Ниже приведены различные состояния жизненного цикла потока —

Основная тема

В C# System.Threading.Thread class используется для работы с потоками. Это позволяет создавать и получать доступ к отдельным потокам в многопоточном приложении. Первый поток, который должен выполняться в процессе, называется главным. нить.

Когда программа C# начинает выполнение, автоматически создается основной поток. Темы, созданные с помощью Thread class называются дочерними потоками основного потока. Вы можете получить доступ к потоку, используя CurrentThread свойство класса Thread.

Следующая программа демонстрирует выполнение основного потока —

Живая демонстрация
06

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —

15 

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

В следующей таблице показаны некоторые наиболее часто используемые свойства. треда класс —

<тд>

Текущий контекст

Получает текущий контекст, в котором выполняется поток.

<тд>

CurrentCulture

Получает или задает язык и региональные параметры для текущего потока.

<тд>

Текущий принцип

Получает или задает текущего принципала потока (для безопасности на основе ролей).

<тд>

Текущая тема

Получает текущий запущенный поток.

<тд>

CurrentUICulture

Получает или задает текущую культуру, используемую диспетчером ресурсов для поиска ресурсов, зависящих от культуры, во время выполнения.

<тд>

Контекст выполнения

Получает объект ExecutionContext, содержащий информацию о различных контекстах текущего потока.

<тд>

Живой

Получает значение, указывающее статус выполнения текущего потока.

<тд>

Исходный фон

Получает или задает значение, указывающее, является ли поток фоновым.

<тд>

Истредпултред

Получает значение, указывающее, принадлежит ли поток управляемому пулу потоков.

<тд>

Идентификатор управляемого потока

Получает уникальный идентификатор текущего управляемого потока.

<тд>

Имя

Получает или задает имя потока.

<тд>

Приоритет

Получает или задает значение, указывающее приоритет планирования потока.

<тд>

Состояние потока

Получает значение, содержащее состояния текущего потока.

Серийный номер Свойство и описание
1
2
3
4
5
6
7
8
9
10
11
12
13

В следующей таблице показаны некоторые из наиболее часто используемых методов. треда класс —

<тд>

public void Abort()

Вызывает исключение ThreadAbortException в потоке, для которого оно вызывается, чтобы начать процесс завершения потока. Вызов этого метода обычно завершает поток.

<тд>

общедоступный статический LocalDataStoreSlot AllocateDataSlot()

Выделяет безымянный слот данных во всех потоках. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.

<тд>

public static LocalDataStoreSlot AllocateNamedDataSlot(string name)

Выделяет именованный слот данных для всех потоков. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.

<тд>

public static void BeginCriticalRegion()

Уведомляет хост о том, что выполнение вот-вот войдет в область кода, в которой последствия прерывания потока или необработанного исключения могут поставить под угрозу другие задачи в домене приложения.

<тд>

public static void BeginThreadAffinity()

Уведомляет хост о том, что управляемый код собирается выполнить инструкции, зависящие от идентификатора текущего физического потока операционной системы.

<тд>

public static void EndCriticalRegion()

Уведомляет хост о том, что выполнение вот-вот войдет в область кода, в которой последствия прерывания потока или необработанного исключения ограничены текущей задачей.

<тд>

public static void EndThreadAffinity()

Уведомляет узел о том, что управляемый код завершил выполнение инструкций, зависящих от идентификатора текущего физического потока операционной системы.

<тд>

public static void FreeNamedDataSlot(string name)

Устраняет связь между именем и слотом для всех потоков в процессе. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.

<тд>

общедоступный статический объект GetData (слот LocalDataStoreSlot)

Извлекает значение из указанного слота в текущем потоке в текущем домене текущего потока. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.

<тд>

общедоступный статический AppDomain GetDomain()

Возвращает текущий домен, в котором выполняется текущий поток.

<тд>

общедоступный статический AppDomain GetDomainID()

Возвращает уникальный идентификатор домена приложения

<тд>

public static LocalDataStoreSlot GetNamedDataSlot(имя строки)

Ищет именованный слот данных. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.

<тд>

Прерывание public void()

Прерывает поток, находящийся в состоянии потока WaitSleepJoin.

<тд>

public void Join()

Блокирует вызывающий поток до тех пор, пока поток не завершится, продолжая выполнять стандартную перекачку COM и SendMessage. Этот метод имеет различные перегруженные формы.

<тд>

public static void MemoryBarrier()

Синхронизирует доступ к памяти следующим образом:процессор, выполняющий текущий поток, не может переупорядочивать инструкции таким образом, чтобы обращения к памяти до вызова MemoryBarrier выполнялись после обращений к памяти, следующих за вызовом MemoryBarrier.

<тд>

public static void ResetAbort()

Отменяет запрос прерывания для текущего потока.

<тд>

public static void SetData(ячейка LocalDataStoreSlot, данные объекта)

Устанавливает данные в указанный слот в текущем потоке для текущего домена этого потока. Для повышения производительности используйте вместо этого поля, отмеченные атрибутом ThreadStaticAttribute.

<тд>

public void Start()

Запускает поток.

<тд>

public static void Sleep(int millisecondsTimeout)

Приостанавливает поток на некоторое время.

<тд>

public static void SpinWait(int iterations)

Заставляет поток ожидать количество раз, определенное параметром iterations

<тд>

общедоступный статический байт VolatileRead(адрес байта ссылки)

public static double VolatileRead(ref double address)

public static int VolatileRead(ref int address)

public static Object VolatileRead(ref Адрес объекта)

Считывает значение поля. Это значение является последним, записанным любым процессором компьютера, независимо от количества процессоров или состояния кэш-памяти процессора. Этот метод имеет различные перегруженные формы. Выше приведены только некоторые из них.

<тд>

public static void VolatileWrite(ref byte address,byte value)

public static void VolatileWrite(ref double address, double value)

public static void VolatileWrite(ref int address, int value)

public static void VolatileWrite(ref Адрес объекта, значение объекта)

Немедленно записывает значение в поле, чтобы оно было видно всем процессорам компьютера. Этот метод имеет различные перегруженные формы. Выше приведены только некоторые из них.

<тд>

public static bool Yield()

Заставляет вызывающий поток передать выполнение другому потоку, который готов к работе на текущем процессоре. Операционная система выбирает поток, которому нужно уступить.

Серийный номер Метод и описание
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Создание тем

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

Следующая программа демонстрирует концепцию —

Живая демонстрация
23

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —

37

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

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

В следующем примере показано использование функции sleep(). метод приостановки потока на определенный период времени.

Живая демонстрация
45

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —

53

Удаление тем

Прервать() метод используется для уничтожения потоков.

Среда выполнения прерывает поток, вызывая исключение ThreadAbortException. . Это исключение не может быть перехвачено, управление отправляется в finally блокировать, если есть.

Следующая программа иллюстрирует это —

Живая демонстрация
66

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —

78

Язык C

  1. Малый и большой диаметр резьбы крепежных деталей
  2. Тема
  3. Тема против. ZigBee (для инженеров Интернета вещей)
  4. Анализ вариантов обработки потока
  5. Многопоточность С++
  6. Python — многопоточное программирование
  7. Edge Computing наконец-то получает фреймворк
  8. Задняя подсветка становится быстрой
  9. Понимание цифрового потока
  10. Что такое нитеобрезатель?