Учебники

ASP.NET — многопоточность

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

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

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

В .Net потоки обрабатываются через пространство имен System.Threading. Создание переменной типа System.Threading.Thread позволяет создать новый поток, с которым можно начать работу. Это позволяет создавать и получать доступ к отдельным потокам в программе.

Создание темы

Поток создается путем создания объекта Thread, давая его конструктору ссылку на ThreadStart.

ThreadStart childthreat = new ThreadStart(childthreadcall);

Жизненный цикл темы

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

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

  • Состояние без запуска : это ситуация, когда создается экземпляр потока, но метод Start не вызывается.

  • Состояние готовности : это ситуация, когда поток готов к выполнению и ожидает цикл ЦП.

  • Состояние Not Runnable : поток не работает, когда:

    • Метод сна был вызван
    • Метод ожидания был вызван
    • Заблокировано операциями ввода / вывода
  • Мертвое состояние : это ситуация, когда поток завершил выполнение или был прерван.

Состояние без запуска : это ситуация, когда создается экземпляр потока, но метод Start не вызывается.

Состояние готовности : это ситуация, когда поток готов к выполнению и ожидает цикл ЦП.

Состояние Not Runnable : поток не работает, когда:

Мертвое состояние : это ситуация, когда поток завершил выполнение или был прерван.

Приоритет потока

Свойство Priority класса Thread определяет приоритет одного потока относительно другого. Среда выполнения .Net выбирает готовый поток с наивысшим приоритетом.

Приоритеты могут быть классифицированы как:

  • Выше нормы
  • Ниже нормы
  • Наибольший
  • низший
  • Нормальный

После создания потока его приоритет устанавливается с помощью свойства Priority класса потока.

NewThread.Priority = ThreadPriority.Highest;

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

Класс Thread имеет следующие важные свойства:

Имущество Описание
CurrentContext Получает текущий контекст, в котором выполняется поток.
CurrentCulture Получает или задает культуру для текущего потока.
CurrentPrinciple Получает или задает текущий участник потока для безопасности на основе ролей.
CurrentThread Получает текущий запущенный поток.
CurrentUICulture Получает или задает текущую культуру, используемую Resource Manager для поиска ресурсов, специфичных для данной культуры, во время выполнения.
ExecutionContext Получает объект ExecutionContext, который содержит информацию о различных контекстах текущего потока.
Является живым Получает значение, указывающее состояние выполнения текущего потока.
IsBackground Получает или задает значение, указывающее, является ли поток фоновым потоком.
IsThreadPoolThread Получает значение, указывающее, принадлежит ли поток к пулу управляемых потоков.
ManagedThreadId Получает уникальный идентификатор для текущего управляемого потока.
название Получает или задает имя потока.
приоритет Получает или задает значение, указывающее приоритет планирования потока.
ThreadState Получает значение, содержащее состояния текущего потока.

Класс Thread имеет следующие важные методы:

методы Описание
выкинуть Вызывает исключение ThreadAbortException в потоке, в котором он вызывается, чтобы начать процесс завершения потока. Вызов этого метода обычно завершает поток.
AllocateDataSlot Выделяет безымянный слот данных во всех потоках. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.
AllocateNamedDataSlot Выделяет именованный слот данных во всех потоках. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.
BeginCriticalRegion Уведомляет хост о том, что при выполнении собирается ввести область кода, в которой последствия прерывания потока или необработанного исключения могут поставить под угрозу другие задачи в домене приложения.
BeginThreadAffinity Уведомляет хост, что управляемый код собирается выполнить инструкции, которые зависят от идентификатора текущего физического потока операционной системы.
EndCriticalRegion Уведомляет хост о том, что выполнение собирается ввести область кода, в которой эффекты прерывания или необработанного исключения потока ограничены текущей задачей.
EndThreadAffinity Уведомляет хост, что управляемый код завершил выполнение инструкций, которые зависят от идентификатора текущего физического потока операционной системы.
FreeNamedDataSlot Устраняет связь между именем и слотом для всех потоков в процессе. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.
Получить данные Извлекает значение из указанного слота в текущем потоке в текущем домене текущего потока. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.
GetDomain Возвращает текущий домен, в котором работает текущий поток.
GetDomainID Возвращает уникальный идентификатор домена приложения.
GetNamedDataSlot Ищет именованный слот данных. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.
Прерывание Прерывает поток, находящийся в состоянии потока WaitSleepJoin.
Присоединиться Блокирует вызывающий поток до тех пор, пока поток не завершится, продолжая при этом выполнять стандартную прокачку COM и SendMessage. Этот метод имеет разные перегруженные формы.
MemoryBarrier Синхронизирует доступ к памяти следующим образом: Процессор, выполняющий текущий поток, не может переупорядочить инструкции таким образом, чтобы доступ к памяти до выполнения вызова MemoryBarrier выполнялся после обращений к памяти, которые следуют после вызова MemoryBarrier.
ResetAbort Отменяет прерывание, запрошенное для текущего потока.
SetData Устанавливает данные в указанном слоте текущего запущенного потока для текущего домена этого потока. Для повышения производительности используйте поля, помеченные атрибутом ThreadStaticAttribute.
Начните Начинает поток.
Спать Заставляет нить приостановиться на некоторое время.
SpinWait Заставляет поток ждать количество раз, определенное параметром iterations.
VolatileRead () Читает значение поля. Значение является последним, записанным любым процессором в компьютере, независимо от количества процессоров или состояния кэша процессора. Этот метод имеет разные перегруженные формы.
VolatileWrite () Немедленно записывает значение в поле, чтобы оно было доступно всем процессорам компьютера. Этот метод имеет разные перегруженные формы.
Уступать Заставляет вызывающий поток передать выполнение другому потоку, который готов к запуску на текущем процессоре. Операционная система выбирает поток для уступки.

пример

В следующем примере показано использование класса Thread. На странице есть элемент управления меткой для отображения сообщений из дочернего потока. Сообщения из основной программы отображаются напрямую с помощью метода Response.Write (). Следовательно, они появляются в верхней части страницы.

Исходный файл выглядит следующим образом:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="threaddemo._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

   <head runat="server">
      <title>
         Untitled Page
      </title>
   </head>
   
   <body>
      <form id="form1" runat="server">
         <div>
            <h3>Thread Example</h3>
         </div>
         
         <asp:Label ID="lblmessage" runat="server" Text="Label">
         </asp:Label>
      </form>
   </body>
   
</html>

Код файла выглядит следующим образом:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;

using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

using System.Xml.Linq;
using System.Threading;

namespace threaddemo
{
   public partial class _Default : System.Web.UI.Page
   {
      protected void Page_Load(object sender, EventArgs e)
      {
         ThreadStart childthreat = new ThreadStart(childthreadcall);
         Response.Write("Child Thread Started <br/>");
         Thread child = new Thread(childthreat);
         
         child.Start();
         
         Response.Write("Main sleeping  for 2 seconds.......<br/>");
         Thread.Sleep(2000);
         Response.Write("<br/>Main aborting child thread<br/>");
         
         child.Abort();
      }
      
      public void childthreadcall()
      {
         try{
            lblmessage.Text = "<br />Child thread started <br/>";
            lblmessage.Text += "Child Thread: Coiunting to 10";
            
            for( int i =0; i<10; i++)
            {
               Thread.Sleep(500);
               lblmessage.Text += "<br/> in Child thread </br>";
            }
            
            lblmessage.Text += "<br/> child thread finished";
            
         }catch(ThreadAbortException e){
         
            lblmessage.Text += "<br /> child thread - exception";
            
         }finally{
            lblmessage.Text += "<br /> child thread - unable to catch the  exception";
         }
      }
   }
}

Соблюдайте следующее

  • Когда страница загружена, запускается новый поток со ссылкой на метод childthreadcall (). Основные действия потока отображаются непосредственно на веб-странице.

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

  • Основной поток спит в течение 2000 мс, в течение которого выполняется дочерний поток.

  • Дочерний поток работает до тех пор, пока он не будет прерван основным потоком. Он вызывает исключение ThreadAbortException и завершается.

  • Управление возвращается в основной поток.

Когда страница загружена, запускается новый поток со ссылкой на метод childthreadcall (). Основные действия потока отображаются непосредственно на веб-странице.

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

Основной поток спит в течение 2000 мс, в течение которого выполняется дочерний поток.

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

Управление возвращается в основной поток.

При выполнении программа отправляет следующие сообщения: