SlideShare a Scribd company logo
1 of 25
System programing
Module 2 Thread
Потік
У кожному процесі Windows міститься початковий
"потік", який функціонує в якості вхідної точки для
програми.
Потік - це шлях виконання всередині процесу.
Перший потік, створений точкою входу процесу,
називається главньш потоком.
У будь-якій виконуваній програмі .NET, точка входу
позначається за допомогою методу Main(). При
виклику цього методу головний потік створюється
автоматично.
Andrii Hladkyi
trilobt@gmail.com 2
Потік
В рамках платформи .NET не існує прямого
відповідношення "один до одного" між доменами
додатків (AppDomain) і потоками. Фактично певний
домен програми може мати кілька потоків, що
виконуються в кожен конкретний момент часу.
Більш того, конкретний потік не прив'язаний до одного
домену додатка протягом свого часу життя. Потоки
можуть перетинати границі доменів додатків, коли це
вважатимуть за доцільне планувальник потоків
Windows і CLR-середовище .NET.
Andrii Hladkyi
trilobt@gmail.com 3
Потік
Незважаючи на те що активні потоки можуть
переміщатися між границями доменів додатків, кожен
потік в будь-який конкретний момент часу може
виконуватися тільки всередині одного домена додатку.
Щоб програмно отримати доступ до домену додатка, в
якому розміщений поточний потік, використувується
статичний метод Thread.GetDomain():
static void ExtractAppDomainHostingThread ()
{
// Отримати домен програми, що розміщує поточний потік.
AppDomain ad = Thread.GetDomain();
}
Andrii Hladkyi
trilobt@gmail.com 4
Потік
Один з багатьох болючих аспектів многопоточного
програмування пов'язаний з обмеженим контролем над
використанням потоків операційною системою або
CLR-середовищем.
Наприклад, написавши блок коду, який створює новий
потік виконання, не можна гарантувати, що цей потік
запуститься негайно. Замість цього такий код лише
просить операційну систему запустити потік, як тільки
це буде можливо (зазвичай, коли планувальник потоків
добереться до нього).
Andrii Hladkyi
trilobt@gmail.com 5
Потік
Більш того, враховуючи, що потоки можуть
переміщатися між границями додатків і контекстів, коли
це потрібно CLR, ви повинні уявляти, які аспекти
програми є змінюванні в потоках (наприклад, піддаються
багатопотокового доступу), а які операції - атомарними
(змінюванні в потоках операції небезпечні ).
Якщо вихідний потік ще не повністю завершив свою
операцію, другий вхідний потік може побачити об'єкт в
частково зміненому стані. У цей момент другий потік,
по суті, читає фіктивні дані, що безумовно може
призвести до дуже дивних помилок, знайти і налагодити
які навіть ще важче.
Andrii Hladkyi
trilobt@gmail.com 6
Багатопоточні додатки
Хоча платформа .NET не може повністю приховати
складності, пов'язані з побудовою надійних
багатопоточних додатків, цей процес все ж значно
спрощений.
Використовуючи типи, визначені всередині простору
імен System.Threading, бібліотеку Task Parallel Library
(TPL) в .NET 4.0 і вище, а також ключові слова asinc і
await мови C# в .NET 4.5, можна працювати з безліччю
потоків, прикладаючи мінімальні зусилля.
Andrii Hladkyi
trilobt@gmail.com 7
namespase System.Threading
Andrii Hladkyi trilobt@gmail.com 8
Тип Призначення
Interlocked Цей тип надає атомарні операції для змінних, розділених між
декількома потоками
Monitor Цей тип забезпечує синхронізацію потокових об'єктів,
використовуючи блокування і очікування/сигнали. Ключове
слово lock мови C # застосовує "за лаштунками" об'єкт
Monitor
Mutex Цей примітив синхронізації може використовуватися для
синхронізації між границями доменів додатків
Parameterized
ThreadStart
Цей делегат дозволяє потоку викликати методи, які
приймають довільну кількість аргументів
Semaphore Цей тип дозволяє обмежити кількість потоків, які можуть
мати доступ до ресурсу або до певного типу ресурсів
одночасно
Thread Цей тип являє потік, що виконується в CLR-середовищі.
Використовуючи етоттіп, можна порождатьдополнітельние
потоки в вихідному домені додатку
ThreadPool Цей тип дозволяє взаємодіяти з підтримуваним CLR пулом
потоків всередині заданого процесу
namespase System.Threading
Andrii Hladkyi
trilobt@gmail.com 9
Тип Призначення
ThreadPriority Це перерахування представляє рівень пріоритету потоку
(Highest, Normal і т.д.)
ThreadStart Цей делегат дозволяє вказати метод для виклику в заданому
потоці. На відміну отделегата ParametrizedThreadStart, цільові
методи ThreadStart завжди повинні мати один і той же
прототип
ThreadState Це перерахування задає допустимі стану потоку (Running,
Aborted і т.д.)
Timer Цей тип надає механізм виконання методу через зазначені
інтервали часу
TimerCallback Цей тип делегата використовується в поєднанні з типами
Timer
Статичні члени класу Thread
Andrii Hladkyi
trilobt@gmail.com 10
Тип Призначення
CurrentContext Ця властивість, призначена тільки для читання, повертає
контекст, в якому в даний момент виконується потік
CurrentThread Це властивість, призначена тільки для читання, повертає
посилання на поточний виконуванийя потік
GetDomain()
GetDomainID()
Цей метод повертає посилання на поточний домен додатка
або ідентифікатор домену, в якому виконується поточний
потік
Sleep() Цей метод призупиняє поточний потік на зазначений час
Члени рівня екземпляра класу Thread
Andrii Hladkyi
trilobt@gmail.com 11
Тип Призначення
IsAlive Повертає буливське значення, яке вказує на те, чи
запущений потік (і поки ще не перерваний і не скасований)
IsBackground Отримує або встановлює значення, яке вказує, чи є даний
потік фоновим
Name Дозволяє встановити дружнє текстове ім'я потоку
Priority Отримує або встановлює пріоритет потоку, який може
приймати значення з перерахування ThreadPriority
ThreadState Отримує стан даного потоку, яке може приймати значення з
перерахування ThreadState
Члени рівня екземпляра класу Thread
Andrii Hladkyi
trilobt@gmail.com 12
Тип Призначення
Abort() Вказує CLR-середовищу на необхідність припинення
потоку, як тільки це буде можливо
Interrupt() Перериває (призупиняє) поточний потік на відповідний
період очікування
Join() Блокує викликаючий потік до тих пір, поки вказаний потік
(той, на якому викликаний метод Join ()) не завершиться
Resume() Відновлює раніше призупинений потік
Start() Вказує CLR-середовищу на необхідність запуску потоку, як
тільки це буде можливо
Suspend() Призупиняє потік. Якщо потік вже припинений, виклик
Suspend () не дає ніякого ефекту
Andrii Hladkyi
trilobt@gmail.com 13
Демонстрація
Ручне створення вторинних потоків
Кроки для ручного створення потоку:
1. Створіть метод, який буде служити точкою входу для нового
потоку.
2. Створіть новий екземпляр делегата ParametrizedThreadStart (або
ThreadStart), передавши конструктору адресу методу, який був
визначений на кроці 1.
3. Створіть об'єкт Thread, передавши конструктору як аргумент
делегат ParametrizedThreadStart/ThreadStart.
4. Встановіть початкові характеристики потоку (ім'я, пріоритет і
т.д.).
5. Викличте метод Thread.Start(). Це призведе до запуску CLR-
середовищем потоку для методу, на який посилається делегат,
створений на кроці 2, при першій же можливості.
Andrii Hladkyi trilobt@gmail.com 14
Асинхронний виклик методів
Andrii Hladkyi trilobt@gmail.com 15
Роль делегатів .NET
Делегат .NET - це по суті безпечний щодо типів, об'єктно-
орієнтований покажчик на функцію.
З типу делегата, .NET компілятор C# побудує запечатаний клас,
наслідуваного від System.MulticastDelegate.
Ці базові класи надають кожному делегату можливість підтримувати
список адресів методів, які можуть бути викликані в більш пізній
час.
public sealed class BinaryOperation : System.MulticastDelegate
{
public BinaryOperation(object target, uint functionAddress);
public int Invoke(int x, int у) ;
public IAsyncResult BeginInvoke(intx, int y, AsyncCallback cb,
object state);
public int EndInvoke(IAsyncResult result);
}
Andrii Hladkyi
trilobt@gmail.com 16
Асинхронна природа делегатів
Коли компілятор C# обробляє ключове слово delegate,
він динамічно генерує клас, який визначає два методи з
іменами BeginInvoke() і EndInvoke().
public sealed class BinaryOperation : System.MulticastDelegate
{
// Використовується для асинхронного виклику методу
public IAsyncResult BeginInvoke(int x, int у, AsyncCallback cb,
object state);
// Використовується для отримання значення, що повертається
// викликаним методом.
public int EndInvoke(IAsyncResult result);
}
Andrii Hladkyi
trilobt@gmail.com 17
Інтерфейс IAsyncResult
Метод BeginInvoke() завжди повертає об'єкт, який реалізує
інтерфейс IAsyncResult, в той час як EndInvoke() вимагає
єдиний параметр сумісного з IAsyncResult типу.
Сумісний з IAsyncResult об'єкт, що повертається з
BeginInvoke() - це в основному зв'язуючий механізм, який
дозволяє викликаючому потоку отримати результат виклику
асинхронного методу через EndInvoke() в більш пізній час.
public interface IAsyncResult
{
object AsyncState { get; }
WaitHandle AsyncWaitHandle { get; }
bool CompletedSynchronously { get; }
bool IsCompleted { get; }
}
Метод, який повертає void, можна просто викликати асинхронно і забути.
Andrii Hladkyi
trilobt@gmail.com 18
Синхронізація викликаючого потоку
Щоб дозволити викликаючому потоку з'ясовувати, чи
завершив свою роботу асинхронно викликаний метод,
в інтерфейсі IAsyncResult передбачено властивість
IsCompleted. З її допомогою викликаючий потік може
визначати, чи дійсно асинхронний виклик був
завершений, перш ніж звертатися до EndInvoke().
Якщо метод ще не завершився, властивість
IsCompleted повертає false,
Andrii Hladkyi
trilobt@gmail.com 19
Роль делегата AsyncCallback
Замість опитування делегата з метою визначення, чи
завершився асинхронно викликаний метод, було б
більш ефективно змусити вторинний потік
інформувати викликаючий потік про завершення
виконання завдання.
Щоб включити таку поведінку, знадобиться передати
методу BeginInvoke() екземпляр делегата
System.AsyncCallback.
Коли передаєтся об'ект AsyncCallback, делегат буде
автоматично викликати вказаний метод по завершенні
асинхронного виклику.
Метод зворотного виклику буде викликаний у вторинному потоці, а не в
первинному.
Andrii Hladkyi
trilobt@gmail.com 20
Передача і отримання спеціальних даних стану
Фінальним аспектом асинхронних делегатів, який
повинен бути врахований, є останній аргумент методу
BeginInvoke(). Цей параметр дозволяє передавати
додаткову інформацію про стан методу зворотного
виклику з первинного потоку.
Для отримання цих даних в контексті методу
зворотного виклику використовується властивість
AsyncState вхідного параметра IAsyncResult.
Andrii Hladkyi
trilobt@gmail.com 21
Andrii Hladkyi
trilobt@gmail.com 22
Демонстрація
Пул потоків CLR
При асинхронному виклику методу з використанням
типів делегатів (через метод BeginInvoke())
середовище CLR насправді не створює новий потік. З
метою ефективності метод BeginInvoke() делегата
задіє пул робочих потоків, який підтримується
виконуючим середовищем. Для взаємодії з цим пулом
в просторі імен System.Threading передбачений клас
ThreadPool. Щоб запросити потік з пулу для обробки
виклику методу, можна скористатися методом
ThreadPool.QueueUserWorkItem(WaitCallback callBack);
ThreadPool.QueueUserWorkItem(WaitCallback callBack,
object state);
Andrii Hladkyi
trilobt@gmail.com 23
Пул потоків CLR
Переваги взаємодії з підтримуваним середовищем
CLR пулом потоків в порівнянні з явним створенням
об'єктів Thread?
1. Пул потоків управляє потоками ефективним чином, зводячи до
мінімуму кількість створюваних, запускаючих і зупиняючих
потоків.
2. За рахунок використання пулу потоків можна зосередитися на
вирішенні завдання, а не на потоковій інфраструктурі додатка.
Проте, в деяких випадках ручне управління потоками
виявляється кращим.
• Коли потрібні потоки переднього плану або повинен бути
встановлений пріоритет потоку. Потоки з пулу завжди є
фоновими і мають стандартний пріоритет (ThreadPriority.
Normal).
• Коли потрібно потік з фіксованою ідентичністю, щоб його
можна було пеперивати, призупиняти або знаходити по імені.
Andrii Hladkyi
trilobt@gmail.com 24
Andrii Hladkyi
trilobt@gmail.com 25
Демонстрація

More Related Content

What's hot

NET Framework and C# Module 6.2. Generics
NET Framework and C# Module 6.2. GenericsNET Framework and C# Module 6.2. Generics
NET Framework and C# Module 6.2. GenericsAndrii Hladkyi
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3eleksdev
 
System programing module 1
System programing module 1System programing module 1
System programing module 1Andrii Hladkyi
 
System programing module 2
System programing module 2System programing module 2
System programing module 2Andrii Hladkyi
 
Net framework і c# module 8
Net framework і c# module 8Net framework і c# module 8
Net framework і c# module 8Andrii Hladkyi
 
System programing module 3
System programing module 3System programing module 3
System programing module 3Andrii Hladkyi
 
Net framework і c# module 17
Net framework і c# module 17Net framework і c# module 17
Net framework і c# module 17Andrii Hladkyi
 
Advanced C#. Part 2
Advanced C#. Part 2Advanced C#. Part 2
Advanced C#. Part 2eleksdev
 
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)Anatoliy Okhotnikov
 
.NET Platform. C# Basics
.NET Platform. C# Basics.NET Platform. C# Basics
.NET Platform. C# Basicseleksdev
 
Net framework і c# module 16
Net framework і c# module 16Net framework і c# module 16
Net framework і c# module 16Andrii Hladkyi
 
12 Architecture
12 Architecture12 Architecture
12 Architectureeleksdev
 
Net framework і c# module 12
Net framework і c# module 12Net framework і c# module 12
Net framework і c# module 12Andrii Hladkyi
 
08 Exceptions and AOP
08  Exceptions and AOP08  Exceptions and AOP
08 Exceptions and AOPeleksdev
 
лаб. роб. №2 обєкти та сервіси що ними надаються
лаб. роб. №2   обєкти та сервіси що ними надаютьсялаб. роб. №2   обєкти та сервіси що ними надаються
лаб. роб. №2 обєкти та сервіси що ними надаютьсяcit-cit
 
Version control
Version controlVersion control
Version controleleksdev
 
Net framework і c# module 14
Net framework і c# module 14Net framework і c# module 14
Net framework і c# module 14Andrii Hladkyi
 
Net framework і c# module 4
Net framework і c# module 4Net framework і c# module 4
Net framework і c# module 4Andrii Hladkyi
 

What's hot (20)

NET Framework and C# Module 6.2. Generics
NET Framework and C# Module 6.2. GenericsNET Framework and C# Module 6.2. Generics
NET Framework and C# Module 6.2. Generics
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3
 
System programing module 1
System programing module 1System programing module 1
System programing module 1
 
System programing module 2
System programing module 2System programing module 2
System programing module 2
 
Net framework і c# module 8
Net framework і c# module 8Net framework і c# module 8
Net framework і c# module 8
 
System programing module 3
System programing module 3System programing module 3
System programing module 3
 
Net framework і c# module 17
Net framework і c# module 17Net framework і c# module 17
Net framework і c# module 17
 
Advanced C#. Part 2
Advanced C#. Part 2Advanced C#. Part 2
Advanced C#. Part 2
 
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)
 
.NET Platform. C# Basics
.NET Platform. C# Basics.NET Platform. C# Basics
.NET Platform. C# Basics
 
Net framework і c# module 16
Net framework і c# module 16Net framework і c# module 16
Net framework і c# module 16
 
12 Architecture
12 Architecture12 Architecture
12 Architecture
 
Net framework і c# module 12
Net framework і c# module 12Net framework і c# module 12
Net framework і c# module 12
 
08 Exceptions and AOP
08  Exceptions and AOP08  Exceptions and AOP
08 Exceptions and AOP
 
Phpunit
PhpunitPhpunit
Phpunit
 
лаб. роб. №2 обєкти та сервіси що ними надаються
лаб. роб. №2   обєкти та сервіси що ними надаютьсялаб. роб. №2   обєкти та сервіси що ними надаються
лаб. роб. №2 обєкти та сервіси що ними надаються
 
Version control
Version controlVersion control
Version control
 
Net framework і c# module 14
Net framework і c# module 14Net framework і c# module 14
Net framework і c# module 14
 
DAL
DALDAL
DAL
 
Net framework і c# module 4
Net framework і c# module 4Net framework і c# module 4
Net framework і c# module 4
 

Similar to System programing module 2. Threads

Similar to System programing module 2. Threads (20)

L l13
L l13L l13
L l13
 
V24 com to_net
V24 com to_netV24 com to_net
V24 com to_net
 
Rpc
RpcRpc
Rpc
 
Multithreading and parallelism
Multithreading and parallelismMultithreading and parallelism
Multithreading and parallelism
 
ASP.Net basics
ASP.Net basics ASP.Net basics
ASP.Net basics
 
Web service lecture
Web service lectureWeb service lecture
Web service lecture
 
Лабораторно-Практична робота
Лабораторно-Практична роботаЛабораторно-Практична робота
Лабораторно-Практична робота
 
Win api module_6.2
Win api module_6.2Win api module_6.2
Win api module_6.2
 
Ado.net module 2
Ado.net module 2Ado.net module 2
Ado.net module 2
 
Lec16 промiжне програмне забезпечення
Lec16 промiжне програмне забезпеченняLec16 промiжне програмне забезпечення
Lec16 промiжне програмне забезпечення
 
лр5 основи modbus tcp
лр5 основи modbus tcpлр5 основи modbus tcp
лр5 основи modbus tcp
 
ASP.Net MVC
ASP.Net MVCASP.Net MVC
ASP.Net MVC
 
Wcf module 3.1
Wcf module 3.1Wcf module 3.1
Wcf module 3.1
 
Asynchronous programming in .NET (UA)
Asynchronous programming in .NET (UA)Asynchronous programming in .NET (UA)
Asynchronous programming in .NET (UA)
 
ASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptxASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptx
 
Opc
OpcOpc
Opc
 
Лекція №11
Лекція №11Лекція №11
Лекція №11
 
Лекція №16
Лекція №16Лекція №16
Лекція №16
 
Wcf module 3.5
Wcf module 3.5Wcf module 3.5
Wcf module 3.5
 
cpp-2013 #19 Concurrency
cpp-2013 #19 Concurrencycpp-2013 #19 Concurrency
cpp-2013 #19 Concurrency
 

More from Andrii Hladkyi (19)

Net Framework and c# Lesson 1
Net Framework and c# Lesson 1Net Framework and c# Lesson 1
Net Framework and c# Lesson 1
 
Wpf module 2
Wpf module 2Wpf module 2
Wpf module 2
 
Wpf module 1
Wpf module 1Wpf module 1
Wpf module 1
 
Msp module 3
Msp module 3Msp module 3
Msp module 3
 
Msp module 2
Msp module 2Msp module 2
Msp module 2
 
Msp module 1
Msp module 1Msp module 1
Msp module 1
 
Ado.net module 1
Ado.net module 1Ado.net module 1
Ado.net module 1
 
Design pattern module 1
Design pattern module 1Design pattern module 1
Design pattern module 1
 
Win api module_2.0_gdi+
Win api module_2.0_gdi+Win api module_2.0_gdi+
Win api module_2.0_gdi+
 
Win api module_1.1_ok
Win api module_1.1_okWin api module_1.1_ok
Win api module_1.1_ok
 
Design pattern module 1
Design pattern module 1Design pattern module 1
Design pattern module 1
 
Net framework і c# lesson1
Net framework і c# lesson1Net framework і c# lesson1
Net framework і c# lesson1
 
Uml module 6
Uml module 6Uml module 6
Uml module 6
 
Uml module 5
Uml module 5Uml module 5
Uml module 5
 
Uml module 4
Uml module 4Uml module 4
Uml module 4
 
Uml module 3
Uml module 3Uml module 3
Uml module 3
 
Uml module 2
Uml module 2Uml module 2
Uml module 2
 
Uml module 1
Uml module 1Uml module 1
Uml module 1
 
Win api module_2.0_gdi+
Win api module_2.0_gdi+Win api module_2.0_gdi+
Win api module_2.0_gdi+
 

System programing module 2. Threads

  • 2. Потік У кожному процесі Windows міститься початковий "потік", який функціонує в якості вхідної точки для програми. Потік - це шлях виконання всередині процесу. Перший потік, створений точкою входу процесу, називається главньш потоком. У будь-якій виконуваній програмі .NET, точка входу позначається за допомогою методу Main(). При виклику цього методу головний потік створюється автоматично. Andrii Hladkyi trilobt@gmail.com 2
  • 3. Потік В рамках платформи .NET не існує прямого відповідношення "один до одного" між доменами додатків (AppDomain) і потоками. Фактично певний домен програми може мати кілька потоків, що виконуються в кожен конкретний момент часу. Більш того, конкретний потік не прив'язаний до одного домену додатка протягом свого часу життя. Потоки можуть перетинати границі доменів додатків, коли це вважатимуть за доцільне планувальник потоків Windows і CLR-середовище .NET. Andrii Hladkyi trilobt@gmail.com 3
  • 4. Потік Незважаючи на те що активні потоки можуть переміщатися між границями доменів додатків, кожен потік в будь-який конкретний момент часу може виконуватися тільки всередині одного домена додатку. Щоб програмно отримати доступ до домену додатка, в якому розміщений поточний потік, використувується статичний метод Thread.GetDomain(): static void ExtractAppDomainHostingThread () { // Отримати домен програми, що розміщує поточний потік. AppDomain ad = Thread.GetDomain(); } Andrii Hladkyi trilobt@gmail.com 4
  • 5. Потік Один з багатьох болючих аспектів многопоточного програмування пов'язаний з обмеженим контролем над використанням потоків операційною системою або CLR-середовищем. Наприклад, написавши блок коду, який створює новий потік виконання, не можна гарантувати, що цей потік запуститься негайно. Замість цього такий код лише просить операційну систему запустити потік, як тільки це буде можливо (зазвичай, коли планувальник потоків добереться до нього). Andrii Hladkyi trilobt@gmail.com 5
  • 6. Потік Більш того, враховуючи, що потоки можуть переміщатися між границями додатків і контекстів, коли це потрібно CLR, ви повинні уявляти, які аспекти програми є змінюванні в потоках (наприклад, піддаються багатопотокового доступу), а які операції - атомарними (змінюванні в потоках операції небезпечні ). Якщо вихідний потік ще не повністю завершив свою операцію, другий вхідний потік може побачити об'єкт в частково зміненому стані. У цей момент другий потік, по суті, читає фіктивні дані, що безумовно може призвести до дуже дивних помилок, знайти і налагодити які навіть ще важче. Andrii Hladkyi trilobt@gmail.com 6
  • 7. Багатопоточні додатки Хоча платформа .NET не може повністю приховати складності, пов'язані з побудовою надійних багатопоточних додатків, цей процес все ж значно спрощений. Використовуючи типи, визначені всередині простору імен System.Threading, бібліотеку Task Parallel Library (TPL) в .NET 4.0 і вище, а також ключові слова asinc і await мови C# в .NET 4.5, можна працювати з безліччю потоків, прикладаючи мінімальні зусилля. Andrii Hladkyi trilobt@gmail.com 7
  • 8. namespase System.Threading Andrii Hladkyi trilobt@gmail.com 8 Тип Призначення Interlocked Цей тип надає атомарні операції для змінних, розділених між декількома потоками Monitor Цей тип забезпечує синхронізацію потокових об'єктів, використовуючи блокування і очікування/сигнали. Ключове слово lock мови C # застосовує "за лаштунками" об'єкт Monitor Mutex Цей примітив синхронізації може використовуватися для синхронізації між границями доменів додатків Parameterized ThreadStart Цей делегат дозволяє потоку викликати методи, які приймають довільну кількість аргументів Semaphore Цей тип дозволяє обмежити кількість потоків, які можуть мати доступ до ресурсу або до певного типу ресурсів одночасно Thread Цей тип являє потік, що виконується в CLR-середовищі. Використовуючи етоттіп, можна порождатьдополнітельние потоки в вихідному домені додатку ThreadPool Цей тип дозволяє взаємодіяти з підтримуваним CLR пулом потоків всередині заданого процесу
  • 9. namespase System.Threading Andrii Hladkyi trilobt@gmail.com 9 Тип Призначення ThreadPriority Це перерахування представляє рівень пріоритету потоку (Highest, Normal і т.д.) ThreadStart Цей делегат дозволяє вказати метод для виклику в заданому потоці. На відміну отделегата ParametrizedThreadStart, цільові методи ThreadStart завжди повинні мати один і той же прототип ThreadState Це перерахування задає допустимі стану потоку (Running, Aborted і т.д.) Timer Цей тип надає механізм виконання методу через зазначені інтервали часу TimerCallback Цей тип делегата використовується в поєднанні з типами Timer
  • 10. Статичні члени класу Thread Andrii Hladkyi trilobt@gmail.com 10 Тип Призначення CurrentContext Ця властивість, призначена тільки для читання, повертає контекст, в якому в даний момент виконується потік CurrentThread Це властивість, призначена тільки для читання, повертає посилання на поточний виконуванийя потік GetDomain() GetDomainID() Цей метод повертає посилання на поточний домен додатка або ідентифікатор домену, в якому виконується поточний потік Sleep() Цей метод призупиняє поточний потік на зазначений час
  • 11. Члени рівня екземпляра класу Thread Andrii Hladkyi trilobt@gmail.com 11 Тип Призначення IsAlive Повертає буливське значення, яке вказує на те, чи запущений потік (і поки ще не перерваний і не скасований) IsBackground Отримує або встановлює значення, яке вказує, чи є даний потік фоновим Name Дозволяє встановити дружнє текстове ім'я потоку Priority Отримує або встановлює пріоритет потоку, який може приймати значення з перерахування ThreadPriority ThreadState Отримує стан даного потоку, яке може приймати значення з перерахування ThreadState
  • 12. Члени рівня екземпляра класу Thread Andrii Hladkyi trilobt@gmail.com 12 Тип Призначення Abort() Вказує CLR-середовищу на необхідність припинення потоку, як тільки це буде можливо Interrupt() Перериває (призупиняє) поточний потік на відповідний період очікування Join() Блокує викликаючий потік до тих пір, поки вказаний потік (той, на якому викликаний метод Join ()) не завершиться Resume() Відновлює раніше призупинений потік Start() Вказує CLR-середовищу на необхідність запуску потоку, як тільки це буде можливо Suspend() Призупиняє потік. Якщо потік вже припинений, виклик Suspend () не дає ніякого ефекту
  • 14. Ручне створення вторинних потоків Кроки для ручного створення потоку: 1. Створіть метод, який буде служити точкою входу для нового потоку. 2. Створіть новий екземпляр делегата ParametrizedThreadStart (або ThreadStart), передавши конструктору адресу методу, який був визначений на кроці 1. 3. Створіть об'єкт Thread, передавши конструктору як аргумент делегат ParametrizedThreadStart/ThreadStart. 4. Встановіть початкові характеристики потоку (ім'я, пріоритет і т.д.). 5. Викличте метод Thread.Start(). Це призведе до запуску CLR- середовищем потоку для методу, на який посилається делегат, створений на кроці 2, при першій же можливості. Andrii Hladkyi trilobt@gmail.com 14
  • 16. Роль делегатів .NET Делегат .NET - це по суті безпечний щодо типів, об'єктно- орієнтований покажчик на функцію. З типу делегата, .NET компілятор C# побудує запечатаний клас, наслідуваного від System.MulticastDelegate. Ці базові класи надають кожному делегату можливість підтримувати список адресів методів, які можуть бути викликані в більш пізній час. public sealed class BinaryOperation : System.MulticastDelegate { public BinaryOperation(object target, uint functionAddress); public int Invoke(int x, int у) ; public IAsyncResult BeginInvoke(intx, int y, AsyncCallback cb, object state); public int EndInvoke(IAsyncResult result); } Andrii Hladkyi trilobt@gmail.com 16
  • 17. Асинхронна природа делегатів Коли компілятор C# обробляє ключове слово delegate, він динамічно генерує клас, який визначає два методи з іменами BeginInvoke() і EndInvoke(). public sealed class BinaryOperation : System.MulticastDelegate { // Використовується для асинхронного виклику методу public IAsyncResult BeginInvoke(int x, int у, AsyncCallback cb, object state); // Використовується для отримання значення, що повертається // викликаним методом. public int EndInvoke(IAsyncResult result); } Andrii Hladkyi trilobt@gmail.com 17
  • 18. Інтерфейс IAsyncResult Метод BeginInvoke() завжди повертає об'єкт, який реалізує інтерфейс IAsyncResult, в той час як EndInvoke() вимагає єдиний параметр сумісного з IAsyncResult типу. Сумісний з IAsyncResult об'єкт, що повертається з BeginInvoke() - це в основному зв'язуючий механізм, який дозволяє викликаючому потоку отримати результат виклику асинхронного методу через EndInvoke() в більш пізній час. public interface IAsyncResult { object AsyncState { get; } WaitHandle AsyncWaitHandle { get; } bool CompletedSynchronously { get; } bool IsCompleted { get; } } Метод, який повертає void, можна просто викликати асинхронно і забути. Andrii Hladkyi trilobt@gmail.com 18
  • 19. Синхронізація викликаючого потоку Щоб дозволити викликаючому потоку з'ясовувати, чи завершив свою роботу асинхронно викликаний метод, в інтерфейсі IAsyncResult передбачено властивість IsCompleted. З її допомогою викликаючий потік може визначати, чи дійсно асинхронний виклик був завершений, перш ніж звертатися до EndInvoke(). Якщо метод ще не завершився, властивість IsCompleted повертає false, Andrii Hladkyi trilobt@gmail.com 19
  • 20. Роль делегата AsyncCallback Замість опитування делегата з метою визначення, чи завершився асинхронно викликаний метод, було б більш ефективно змусити вторинний потік інформувати викликаючий потік про завершення виконання завдання. Щоб включити таку поведінку, знадобиться передати методу BeginInvoke() екземпляр делегата System.AsyncCallback. Коли передаєтся об'ект AsyncCallback, делегат буде автоматично викликати вказаний метод по завершенні асинхронного виклику. Метод зворотного виклику буде викликаний у вторинному потоці, а не в первинному. Andrii Hladkyi trilobt@gmail.com 20
  • 21. Передача і отримання спеціальних даних стану Фінальним аспектом асинхронних делегатів, який повинен бути врахований, є останній аргумент методу BeginInvoke(). Цей параметр дозволяє передавати додаткову інформацію про стан методу зворотного виклику з первинного потоку. Для отримання цих даних в контексті методу зворотного виклику використовується властивість AsyncState вхідного параметра IAsyncResult. Andrii Hladkyi trilobt@gmail.com 21
  • 23. Пул потоків CLR При асинхронному виклику методу з використанням типів делегатів (через метод BeginInvoke()) середовище CLR насправді не створює новий потік. З метою ефективності метод BeginInvoke() делегата задіє пул робочих потоків, який підтримується виконуючим середовищем. Для взаємодії з цим пулом в просторі імен System.Threading передбачений клас ThreadPool. Щоб запросити потік з пулу для обробки виклику методу, можна скористатися методом ThreadPool.QueueUserWorkItem(WaitCallback callBack); ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state); Andrii Hladkyi trilobt@gmail.com 23
  • 24. Пул потоків CLR Переваги взаємодії з підтримуваним середовищем CLR пулом потоків в порівнянні з явним створенням об'єктів Thread? 1. Пул потоків управляє потоками ефективним чином, зводячи до мінімуму кількість створюваних, запускаючих і зупиняючих потоків. 2. За рахунок використання пулу потоків можна зосередитися на вирішенні завдання, а не на потоковій інфраструктурі додатка. Проте, в деяких випадках ручне управління потоками виявляється кращим. • Коли потрібні потоки переднього плану або повинен бути встановлений пріоритет потоку. Потоки з пулу завжди є фоновими і мають стандартний пріоритет (ThreadPriority. Normal). • Коли потрібно потік з фіксованою ідентичністю, щоб його можна було пеперивати, призупиняти або знаходити по імені. Andrii Hladkyi trilobt@gmail.com 24