Поток определяется как путь выполнения программы. Каждый поток определяет уникальный элемент управления потоком. Если ваше приложение включает в себя сложные и трудоемкие операции, такие как доступ к базе данных или некоторые интенсивные операции ввода-вывода, то часто бывает очень полезно настроить разные пути выполнения или потоки, где каждый поток выполняет определенную работу.
Потоки — это легкие процессы. Распространенным примером использования потоков является реализация параллельного программирования в современных операционных системах. Использование потоков позволяет избежать потери циклов ЦП и повысить эффективность приложений.
Программа, которую мы скомпилировали до сих пор, выполняется как один процесс в потоке, который является работающим экземпляром приложения. Однако такое приложение может выполнять только одну работу одновременно. Чтобы он выполнял несколько задач одновременно, вы можете разделить его на более мелкие потоки.
В .Net потоки обрабатываются через пространство имен System.Threading. Создание переменных типа system.threading.thread позволяет вам создать новый поток для начала работы. Это позволяет вам создавать и получать доступ к независимым потокам в отдельном потоке.
Поток создается из объекта потока, и его конструктору передается ссылка на запуск потока.
ThreadStart childthreat = новый ThreadStart (childthreadcall);
Жизненный цикл потока начинается, когда создается объект класса system.threading.thread, и заканчивается, когда поток завершается или завершается выполнение.
Ниже приведены различные состояния жизненного цикла потока:
Состояние ожидания запуска: экземпляр потока был создан, но метод запуска не был вызван.
Состояние готовности: ситуация, когда поток готов к выполнению и ожидает цикла ЦП.
Незапускаемое состояние: когда поток не может быть запущен, существует несколько возможностей:
Текущий метод сна называется
Метод ожидания называется
Заблокировано операцией ввода-вывода
Состояние смерти: поток завершил выполнение или был прекращен.
Атрибут Priority в классе Thread главным образом определяет приоритет потока относительно других потоков. Среда выполнения .NET выбирает готовый поток с наивысшим приоритетом. Приоритет можно разделить на:
выше, чем обычно
ниже, чем обычно
Самый высокий
самый низкий
нормальный
После создания потока система устанавливает его приоритет, используя систему установки приоритетов класса Thread.
NewThread.Priority = ThreadPriority.Highest;
Класс потока имеет следующие важные особенности:
свойство | описывать |
---|---|
Текущийконтекст | Получить содержимое текущего выполняющегося потока. |
Текущая культура | Получает или задает среду текущего потока. |
ТекущийПринцип | Получает или задает политику безопасности на основе ролей текущего процесса. |
Текущий поток | Получите текущий запущенный поток. |
ТекущаяUIкультура | Получает или задает текущую среду, используемую диспетчером ресурсов текущего процесса для поиска определенных ресурсов. |
Контекст выполнения | Получает объект ExecutionContext, содержащий контекстную информацию о текущем потоке. |
жив | Получает значение, указывающее состояние выполнения текущего потока. |
IsBackground | Background Получает или задает значение, указывающее, является ли поток фоновым потоком. |
IsThreadPoolThread | Получает значение, указывающее, принадлежит ли поток управляемому пулу потоков. |
идентификатор управляемого потока | Получает текущий уникальный идентификатор управляемого потока. |
Имя | Получает или задает имя потока. |
Приоритет | Получает или задает значение, указывающее приоритет планирования потока. |
Состояние потока | Получает значение, содержащее состояние текущего потока. |
Класс потока имеет следующие важные методы:
метод | описывать |
---|---|
Прервать | Вызов ThreadAbortException начинает процесс завершения потока. Вызов этого метода обычно завершает поток. |
Аллокатедатаслот | Всем потокам назначается безымянный слот данных. Для повышения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute. |
Аллокатенамеддатаслот | Выделите именованные слоты данных для всех потоков. Для повышения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute. |
НачатьКритическийРегион | Уведомляет хост о том, что выполнение скоро войдет в область кода, где последствия прерывания потока или необработанного исключения могут поставить под угрозу другие задачи. |
Бегинтредаффинити | Уведомляет хост о том, что управляемый код собирается выполнить, в зависимости от идентификатора текущего физического потока операционной системы. |
КонецКритическийРегион | Уведомляет хост о том, что выполнение скоро войдет в область кода, где прерывание потока или необработанное исключение влияет только на текущую задачу. |
EndThreadAffinity | Уведомляет хост о завершении выполнения управляемого кода, в зависимости от идентификатора текущего физического потока операционной системы. |
FreeNamedDataSlot | Устраняет связь между именами и слотами для всех потоков в процессе. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute. |
Получить данные | Извлекает значение из слота, указанного текущим потоком в текущем домене текущего потока. Для повышения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute. |
Получить домен | Возвращает текущий выполняющийся поток в текущем домене. |
ПолучитьDomainID | Возвращает уникальный идентификатор домена приложения. |
GetNamedDataSlot | Найдите именованный слот данных. Для повышения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute. |
Прерывать | Прервите поток в состоянии потока WaitSleepJoin. |
Присоединиться | Блокирует вызывающий поток до тех пор, пока один из потоков не завершится, продолжая стандартное выполнение COM и SendMessage. Этот метод имеет различные перегруженные формы. |
ПамятьБарьер | Синхронный доступ к памяти заключается в следующем: ускоритель, обрабатывающий текущий поток, не может переупорядочить инструкции таким образом, чтобы при доступе к памяти вызывался MemoryBarrier с последующим выполнением доступа к памяти. |
СбросОтмена | Отменяет запрос на прерывание текущего потока. |
SetData | Устанавливает данные для текущего работающего потока в указанном временном интервале и текущий домен этого потока. Для повышения производительности домен приложения имеет атрибут ThreadStaticAttribute домена. |
Начинать | Начать тред. |
Спать | Заставляет поток приостанавливаться на определенный период времени. |
SpinWait | Заставляет поток ждать количество итераций, определенное параметром. |
ВолатильноеЧтение() | Прочитайте значение поля. Последнее значение записывается любым процессором компьютера, независимо от процессора или номера состояния кэша процессора. Этот метод имеет различные перегруженные формы. |
Волатильная запись() | Немедленно записывает значение в поле, видимое всем процессорам компьютера. Этот метод имеет различные перегруженные формы. |
Урожай | Заставляет вызывающий поток выполнять другой поток, который может работать на текущем процессоре, и операционная система решает перенаправить поток |
Следующий пример иллюстрирует использование классов потоков. На странице есть метка управления, которая отображает сообщения из дочерних потоков. Сообщения из основной программы отображаются напрямую с помощью метода response.write(50), поэтому они появляются вверху страницы.
Исходные файлы следующие:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="threaddemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// RU" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Страница без названия </title> </head> <body> <form id="form1" " runat="server"> <div> <h3>Пример потока</h3> </div> <asp:Label ID="lblmessage" runat="server" Text="Label"> </asp:Label> < /форма> </body> </html>
Фоновый код выглядит следующим образом:
использование System.Collections; использование System.Data; использование System.Web.Security; использование System.Web.UI.HtmlControls; ; используя System.Web.UI.WebControls; используя System.Web.UI.WebControls.WebParts; используя System.Xml.Linq, используя пространство имен Threaddemo; class _Default: System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ThreadStart childthreat = new ThreadStart(childthreadcall); Response.Write("Начался дочерний поток <br/>"); Thread(childthreat); child.Start(); Response.Write("Основной спит 2 секунды....<br/>"); Thread.Sleep(2000); Response.Write("<br/>Основной прерывающийся дочерний поток<br/>"); child.Abort(); } public void childthreadcall() { try{ lblmessage.Text = "<br/ >Начался дочерний поток <br/>"; lblmessage.Text += "Дочерний поток: Счет до 10"; for( int i =0; i<10; i++) { Thread.Sleep(500); lblmessage.Text += "<br/> в дочернем потоке </br>"; } lblmessage.Text += "<br/> дочерний поток завершен"; catch(ThreadAbortException e){ lblmessage.Text += "<br /> дочерний поток - исключение" }finally{ lblmessage.Text +=; "<br /> дочерний поток - не удалось перехватить исключение" } } } };
Когда страница загружается, запускается новый поток с помощью childthreadcall() в качестве ссылки. Действия основной ветки будут отображаться непосредственно на веб-странице.
Второй поток запускается и отправляет сообщение управляющему тегу.
Основной поток находится в режиме ожидания 2000 миллисекунд, пока выполняется дочерний поток.
Дочерний поток продолжает выполняться до тех пор, пока не будет завершен основным потоком, затем он генерирует исключение ThreadAbortException и завершается.
Управление возвращается в основной поток.
При запуске программа отправит следующую информацию: