SlideShare a Scribd company logo
1 of 22
System programing
Module 2 Thread
Потік
У кожному процесі Windows міститься початковий
"потік", який функціонує в якості вхідної точки для
програми.
Потік - це шлях виконання всередині процесу.
Перший потік, створений точкою входу процесу,
називається главньш потоком.
У будь-якій виконуваній програмі .NET, точка входу
позначається за допомогою методу Main(). При
виклику цього методу головний потік створюється
автоматично.
Andrey Gladky
KspDevelop@gmail.com 2
Потік
В рамках платформи .NET не існує прямого
відповідношення "один до одного" між доменами
додатків (AppDomain) і потоками. Фактично певний
домен програми може мати кілька потоків, що
виконуються в кожен конкретний момент часу.
Більш того, конкретний потік не прив'язаний до одного
домену додатка протягом свого часу життя. Потоки
можуть перетинати границі доменів додатків, коли це
вважатимуть за доцільне планувальник потоків
Windows і CLR-середовище .NET.
Andrey Gladky
KspDevelop@gmail.com 3
Потік
Незважаючи на те що активні потоки можуть
переміщатися між границями доменів додатків, кожен
потік в будь-який конкретний момент часу може
виконуватися тільки всередині одного домена додатку.
Щоб програмно отримати доступ до домену додатка, в
якому розміщений поточний потік, використувується
статичний метод Thread.GetDomain():
static void ExtractAppDomainHostingThread ()
{
// Отримати домен програми, що розміщує поточний потік.
AppDomain ad = Thread.GetDomain();
}
Andrey Gladky
KspDevelop@gmail.com 4
Потік
Один з багатьох болючих аспектів многопоточного
програмування пов'язаний з обмеженим контролем над
використанням потоків операційною системою або
CLR-середовищем.
Наприклад, написавши блок коду, який створює новий
потік виконання, не можна гарантувати, що цей потік
запуститься негайно. Замість цього такий код лише
просить операційну систему запустити потік, як тільки
це буде можливо (зазвичай, коли планувальник потоків
добереться до нього).
Andrey Gladky
KspDevelop@gmail.com 5
Потік
Більш того, враховуючи, що потоки можуть
переміщатися між границями додатків і контекстів, коли
це потрібно CLR, ви повинні уявляти, які аспекти
програми є змінюванні в потоках (наприклад, піддаються
багатопотокового доступу), а які операції - атомарними
(змінюванні в потоках операції небезпечні ).
Якщо вихідний потік ще не повністю завершив свою
операцію, другий вхідний потік може побачити об'єкт в
частково зміненому стані. У цей момент другий потік,
по суті, читає фіктивні дані, що безумовно може
призвести до дуже дивних помилок, знайти і налагодити
які навіть ще важче.
Andrey Gladky
KspDevelop@gmail.com 6
Багатопоточні додатки
Хоча платформа .NET не може повністю приховати
складності, пов'язані з побудовою надійних
багатопоточних додатків, цей процес все ж значно
спрощений.
Використовуючи типи, визначені всередині простору
імен System.Threading, бібліотеку Task Parallel Library
(TPL) в .NET 4.0 і вище, а також ключові слова asinc і
await мови C# в .NET 4.5, можна працювати з безліччю
потоків, прикладаючи мінімальні зусилля.
Andrey Gladky
KspDevelop@gmail.com 7
namespase System.Threading
Andrey Gladky
KspDevelop@gmail.com 8
Тип Призначення
Interlocked Цей тип надає атомарні операції для змінних, розділених між
декількома потоками
Monitor Цей тип забезпечує синхронізацію потокових об'єктів,
використовуючи блокування і очікування/сигнали. Ключове
слово lock мови C # застосовує "за лаштунками" об'єкт
Monitor
Mutex Цей примітив синхронізації може використовуватися для
синхронізації між границями доменів додатків
Parameterized
ThreadStart
Цей делегат дозволяє потоку викликати методи, які
приймають довільну кількість аргументів
Semaphore Цей тип дозволяє обмежити кількість потоків, які можуть
мати доступ до ресурсу або до певного типу ресурсів
одночасно
Thread Цей тип являє потік, що виконується в CLR-середовищі.
Використовуючи етоттіп, можна порождатьдополнітельние
потоки в вихідному домені додатку
ThreadPool Цей тип дозволяє взаємодіяти з підтримуваним CLR пулом
потоків всередині заданого процесу
namespase System.Threading
Andrey Gladky
KspDevelop@gmail.com 9
Тип Призначення
ThreadPriority Це перерахування представляє рівень пріоритету потоку
(Highest, Normal і т.д.)
ThreadStart Цей делегат дозволяє вказати метод для виклику в заданому
потоці. На відміну отделегата ParametrizedThreadStart, цільові
методи ThreadStart завжди повинні мати один і той же
прототип
ThreadState Це перерахування задає допустимі стану потоку (Running,
Aborted і т.д.)
Timer Цей тип надає механізм виконання методу через зазначені
інтервали часу
TimerCallback Цей тип делегата використовується в поєднанні з типами
Timer
Статичні члени класу Thread
Andrey Gladky
KspDevelop@gmail.com 10
Тип Призначення
CurrentContext Ця властивість, призначена тільки для читання, повертає
контекст, в якому в даний момент виконується потік
CurrentThread Це властивість, призначена тільки для читання, повертає
посилання на поточний виконуванийя потік
GetDomain()
GetDomainID()
Цей метод повертає посилання на поточний домен додатка
або ідентифікатор домену, в якому виконується поточний
потік
Sleep() Цей метод призупиняє поточний потік на зазначений час
Члени рівня екземпляра класу Thread
Andrey Gladky
KspDevelop@gmail.com 11
Тип Призначення
IsAlive Повертає буливське значення, яке вказує на те, чи
запущений потік (і поки ще не перерваний і не скасований)
IsBackground Отримує або встановлює значення, яке вказує, чи є даний
потік фоновим
Name Дозволяє встановити дружнє текстове ім'я потоку
Priority Отримує або встановлює пріоритет потоку, який може
приймати значення з перерахування ThreadPriority
ThreadState Отримує стан даного потоку, яке може приймати значення з
перерахування ThreadState
Члени рівня екземпляра класу Thread
Andrey Gladky
KspDevelop@gmail.com 12
Тип Призначення
Abort() Вказує CLR-середовищу на необхідність припинення
потоку, як тільки це буде можливо
Interrupt() Перериває (призупиняє) поточний потік на відповідний
період очікування
Join() Блокує викликаючий потік до тих пір, поки вказаний потік
(той, на якому викликаний метод Join ()) не завершиться
Resume() Відновлює раніше призупинений потік
Start() Вказує CLR-середовищу на необхідність запуску потоку, як
тільки це буде можливо
Suspend() Призупиняє потік. Якщо потік вже припинений, виклик
Suspend () не дає ніякого ефекту
Andrey Gladky
KspDevelop@gmail.com 13
Демонстрація
Ручне створення вторинних потоків
Кроки для ручного створення потоку:
1. Створіть метод, який буде служити точкою входу для нового
потоку.
2. Створіть новий екземпляр делегата ParametrizedThreadStart (або
ThreadStart), передавши конструктору адресу методу, який був
визначений на кроці 1.
3. Створіть об'єкт Thread, передавши конструктору як аргумент
делегат ParametrizedThreadStart/ThreadStart.
4. Встановіть початкові характеристики потоку (ім'я, пріоритет і
т.д.).
5. Викличте метод Thread.Start(). Це призведе до запуску CLR-
середовищем потоку для методу, на який посилається делегат,
створений на кроці 2, при першій же можливості.
Andrey Gladky
KspDevelop@gmail.com 14
Асинхронний виклик методів
Andrey Gladky
KspDevelop@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);
}
Andrey Gladky
KspDevelop@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);
}
Andrey Gladky
KspDevelop@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, можна просто викликати асинхронно і забути.
Andrey Gladky
KspDevelop@gmail.com 18
Синхронізація викликаючого потоку
Щоб дозволити викликаючому потоку з'ясовувати, чи
завершив свою роботу асинхронно викликаний метод,
в інтерфейсі IAsyncResult передбачено властивість
IsCompleted. З її допомогою викликаючий потік може
визначати, чи дійсно асинхронний виклик був
завершений, перш ніж звертатися до EndInvoke().
Якщо метод ще не завершився, властивість
IsCompleted повертає false,
Andrey Gladky
KspDevelop@gmail.com 19
Роль делегата AsyncCallback
Замість опитування делегата з метою визначення, чи
завершився асинхронно викликаний метод, було б
більш ефективно змусити вторинний потік
інформувати викликаючий потік про завершення
виконання завдання.
Щоб включити таку поведінку, знадобиться передати
методу BeginInvoke() екземпляр делегата
System.AsyncCallback.
Коли передаєтся об'ект AsyncCallback, делегат буде
автоматично викликати вказаний метод по завершенні
асинхронного виклику.
Метод зворотного виклику буде викликаний у вторинному потоці, а не в
первинному.
Andrey Gladky
KspDevelop@gmail.com 20
Передача і отримання спеціальних даних стану
Фінальним аспектом асинхронних делегатів, який
повинен бути врахований, є останній аргумент методу
BeginInvoke(). Цей параметр дозволяє передавати
додаткову інформацію про стан методу зворотного
виклику з первинного потоку.
Для отримання цих даних в контексті методу
зворотного виклику використовується властивість
AsyncState вхідного параметра IAsyncResult.
Andrey Gladky
KspDevelop@gmail.com 21
Andrey Gladky
KspDevelop@gmail.com 22
Демонстрація

More Related Content

What's hot

G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2eleksdev
 
Asynchronous programming in .NET (UA)
Asynchronous programming in .NET (UA)Asynchronous programming in .NET (UA)
Asynchronous programming in .NET (UA)Oleksandr Pavlyshak
 
Version control
Version controlVersion control
Version controleleksdev
 
System programing module 1. Processes
System programing module 1. ProcessesSystem programing module 1. Processes
System programing module 1. ProcessesAndrii Hladkyi
 
.NET Platform. C# Basics
.NET Platform. C# Basics.NET Platform. C# Basics
.NET Platform. C# Basicseleksdev
 
11 web services
11 web services11 web services
11 web serviceseleksdev
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3eleksdev
 
V24 com to_net
V24 com to_netV24 com to_net
V24 com to_netRingonoki
 
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
 
10 asp.net
10 asp.net 10 asp.net
10 asp.net eleksdev
 
07 Database Access
07 Database Access07 Database Access
07 Database Accesseleksdev
 
Основнi моменти модульного тестування в Qt
Основнi моменти модульного тестування в QtОсновнi моменти модульного тестування в Qt
Основнi моменти модульного тестування в QtTrola.org
 
Aspnet core
Aspnet coreAspnet core
Aspnet coreeleksdev
 

What's hot (20)

G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2
 
Asynchronous programming in .NET (UA)
Asynchronous programming in .NET (UA)Asynchronous programming in .NET (UA)
Asynchronous programming in .NET (UA)
 
Version control
Version controlVersion control
Version control
 
System programing module 1. Processes
System programing module 1. ProcessesSystem programing module 1. Processes
System programing module 1. Processes
 
.NET Platform. C# Basics
.NET Platform. C# Basics.NET Platform. C# Basics
.NET Platform. C# Basics
 
11 web services
11 web services11 web services
11 web services
 
Tdd, ти де?
Tdd, ти де?Tdd, ти де?
Tdd, ти де?
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3
 
V24 com to_net
V24 com to_netV24 com to_net
V24 com to_net
 
Phpunit
PhpunitPhpunit
Phpunit
 
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)
 
Лекція №6
Лекція №6Лекція №6
Лекція №6
 
cpp-2013 #19 Concurrency
cpp-2013 #19 Concurrencycpp-2013 #19 Concurrency
cpp-2013 #19 Concurrency
 
10 asp.net
10 asp.net 10 asp.net
10 asp.net
 
Multithreading and parallelism
Multithreading and parallelismMultithreading and parallelism
Multithreading and parallelism
 
cpp-2013 #20 Best practices
cpp-2013 #20 Best practicescpp-2013 #20 Best practices
cpp-2013 #20 Best practices
 
Theme20_ajax
Theme20_ajaxTheme20_ajax
Theme20_ajax
 
07 Database Access
07 Database Access07 Database Access
07 Database Access
 
Основнi моменти модульного тестування в Qt
Основнi моменти модульного тестування в QtОсновнi моменти модульного тестування в Qt
Основнi моменти модульного тестування в Qt
 
Aspnet core
Aspnet coreAspnet core
Aspnet core
 

Similar to System programing module 2

Лабораторно-Практична робота
Лабораторно-Практична роботаЛабораторно-Практична робота
Лабораторно-Практична роботаAnna Popravka
 
Lecture 06. iOS Programming. Основи Objective-C
Lecture 06. iOS Programming. Основи Objective-CLecture 06. iOS Programming. Основи Objective-C
Lecture 06. iOS Programming. Основи Objective-CMaksym Davydov
 
Lec16 промiжне програмне забезпечення
Lec16 промiжне програмне забезпеченняLec16 промiжне програмне забезпечення
Lec16 промiжне програмне забезпеченняcit-cit
 
ASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptxASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptxIhor34
 
лаб. роб. №2 обєкти та сервіси що ними надаються
лаб. роб. №2   обєкти та сервіси що ними надаютьсялаб. роб. №2   обєкти та сервіси що ними надаються
лаб. роб. №2 обєкти та сервіси що ними надаютьсяcit-cit
 
5 Підсистема введення/виведення. OPC
5 Підсистема введення/виведення. OPC5 Підсистема введення/виведення. OPC
5 Підсистема введення/виведення. OPCПупена Александр
 
Загальні принципи розроблення АРМ оператора на базі SCADA/HMI
Загальні принципи розроблення АРМ оператора на базі SCADA/HMIЗагальні принципи розроблення АРМ оператора на базі SCADA/HMI
Загальні принципи розроблення АРМ оператора на базі SCADA/HMIПупена Александр
 
Lec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування edLec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування edcit-cit
 

Similar to System programing module 2 (20)

ASP.Net basics
ASP.Net basics ASP.Net basics
ASP.Net basics
 
ASP.Net MVC
ASP.Net MVCASP.Net MVC
ASP.Net MVC
 
Лабораторно-Практична робота
Лабораторно-Практична роботаЛабораторно-Практична робота
Лабораторно-Практична робота
 
Lecture 06. iOS Programming. Основи Objective-C
Lecture 06. iOS Programming. Основи Objective-CLecture 06. iOS Programming. Основи Objective-C
Lecture 06. iOS Programming. Основи Objective-C
 
Ado.net module 2
Ado.net module 2Ado.net module 2
Ado.net module 2
 
Lec16 промiжне програмне забезпечення
Lec16 промiжне програмне забезпеченняLec16 промiжне програмне забезпечення
Lec16 промiжне програмне забезпечення
 
NodeJS.pptx
NodeJS.pptxNodeJS.pptx
NodeJS.pptx
 
Wcf module 2
Wcf module 2Wcf module 2
Wcf module 2
 
ASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptxASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptx
 
лаб. роб. №2 обєкти та сервіси що ними надаються
лаб. роб. №2   обєкти та сервіси що ними надаютьсялаб. роб. №2   обєкти та сервіси що ними надаються
лаб. роб. №2 обєкти та сервіси що ними надаються
 
5 Підсистема введення/виведення. OPC
5 Підсистема введення/виведення. OPC5 Підсистема введення/виведення. OPC
5 Підсистема введення/виведення. OPC
 
Ado.net module 1
Ado.net module 1Ado.net module 1
Ado.net module 1
 
лр5 основи modbus tcp
лр5 основи modbus tcpлр5 основи modbus tcp
лр5 основи modbus tcp
 
Лекція №16
Лекція №16Лекція №16
Лекція №16
 
Wcf module 3.5
Wcf module 3.5Wcf module 3.5
Wcf module 3.5
 
Opc
OpcOpc
Opc
 
Розгортання середовища для Camunda
Розгортання середовища для CamundaРозгортання середовища для Camunda
Розгортання середовища для Camunda
 
Загальні принципи розроблення АРМ оператора на базі SCADA/HMI
Загальні принципи розроблення АРМ оператора на базі SCADA/HMIЗагальні принципи розроблення АРМ оператора на базі SCADA/HMI
Загальні принципи розроблення АРМ оператора на базі SCADA/HMI
 
Лекція №11
Лекція №11Лекція №11
Лекція №11
 
Lec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування edLec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування ed
 

More from Andrii Hladkyi

Net framework and C# module 17. Serialization
Net framework and  C# module 17. SerializationNet framework and  C# module 17. Serialization
Net framework and C# module 17. SerializationAndrii Hladkyi
 
Net Framework and C# Module 3 4. Inheritance, Abstractions
Net Framework and C# Module 3 4. Inheritance, AbstractionsNet Framework and C# Module 3 4. Inheritance, Abstractions
Net Framework and C# Module 3 4. Inheritance, AbstractionsAndrii Hladkyi
 
NET Framework and C# Module 12.2. Garbage Collector
NET Framework and C# Module 12.2. Garbage CollectorNET Framework and C# Module 12.2. Garbage Collector
NET Framework and C# Module 12.2. Garbage CollectorAndrii Hladkyi
 
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
 
NET Framework and C# Module 6. Delegates, Events
NET Framework and C# Module 6. Delegates, EventsNET Framework and C# Module 6. Delegates, Events
NET Framework and C# Module 6. Delegates, EventsAndrii Hladkyi
 
NET Framework and C# Module 5. Interfaces
NET Framework and C# Module 5. InterfacesNET Framework and C# Module 5. Interfaces
NET Framework and C# Module 5. InterfacesAndrii Hladkyi
 
Net Framework and c# module 2. OOP
Net Framework and c# module 2. OOPNet Framework and c# module 2. OOP
Net Framework and c# module 2. OOPAndrii Hladkyi
 
Net Framework and c# Lesson 1
Net Framework and c# Lesson 1Net Framework and c# Lesson 1
Net Framework and c# Lesson 1Andrii Hladkyi
 
Design pattern module 1
Design pattern module 1Design pattern module 1
Design pattern module 1Andrii Hladkyi
 
Win api module_2.0_gdi+
Win api module_2.0_gdi+Win api module_2.0_gdi+
Win api module_2.0_gdi+Andrii Hladkyi
 
Design pattern module 1
Design pattern module 1Design pattern module 1
Design pattern module 1Andrii Hladkyi
 
Net framework і c# lesson1
Net framework і c# lesson1Net framework і c# lesson1
Net framework і c# lesson1Andrii Hladkyi
 

More from Andrii Hladkyi (20)

Net framework and C# module 17. Serialization
Net framework and  C# module 17. SerializationNet framework and  C# module 17. Serialization
Net framework and C# module 17. Serialization
 
Net Framework and C# Module 3 4. Inheritance, Abstractions
Net Framework and C# Module 3 4. Inheritance, AbstractionsNet Framework and C# Module 3 4. Inheritance, Abstractions
Net Framework and C# Module 3 4. Inheritance, Abstractions
 
NET Framework and C# Module 12.2. Garbage Collector
NET Framework and C# Module 12.2. Garbage CollectorNET Framework and C# Module 12.2. Garbage Collector
NET Framework and C# Module 12.2. Garbage Collector
 
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
 
NET Framework and C# Module 6. Delegates, Events
NET Framework and C# Module 6. Delegates, EventsNET Framework and C# Module 6. Delegates, Events
NET Framework and C# Module 6. Delegates, Events
 
NET Framework and C# Module 5. Interfaces
NET Framework and C# Module 5. InterfacesNET Framework and C# Module 5. Interfaces
NET Framework and C# Module 5. Interfaces
 
Net Framework and c# module 2. OOP
Net Framework and c# module 2. OOPNet Framework and c# module 2. OOP
Net Framework and c# module 2. OOP
 
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
 
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
 
Win api module_6.2
Win api module_6.2Win api module_6.2
Win api module_6.2
 
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
 

System programing module 2

  • 2. Потік У кожному процесі Windows міститься початковий "потік", який функціонує в якості вхідної точки для програми. Потік - це шлях виконання всередині процесу. Перший потік, створений точкою входу процесу, називається главньш потоком. У будь-якій виконуваній програмі .NET, точка входу позначається за допомогою методу Main(). При виклику цього методу головний потік створюється автоматично. Andrey Gladky KspDevelop@gmail.com 2
  • 3. Потік В рамках платформи .NET не існує прямого відповідношення "один до одного" між доменами додатків (AppDomain) і потоками. Фактично певний домен програми може мати кілька потоків, що виконуються в кожен конкретний момент часу. Більш того, конкретний потік не прив'язаний до одного домену додатка протягом свого часу життя. Потоки можуть перетинати границі доменів додатків, коли це вважатимуть за доцільне планувальник потоків Windows і CLR-середовище .NET. Andrey Gladky KspDevelop@gmail.com 3
  • 4. Потік Незважаючи на те що активні потоки можуть переміщатися між границями доменів додатків, кожен потік в будь-який конкретний момент часу може виконуватися тільки всередині одного домена додатку. Щоб програмно отримати доступ до домену додатка, в якому розміщений поточний потік, використувується статичний метод Thread.GetDomain(): static void ExtractAppDomainHostingThread () { // Отримати домен програми, що розміщує поточний потік. AppDomain ad = Thread.GetDomain(); } Andrey Gladky KspDevelop@gmail.com 4
  • 5. Потік Один з багатьох болючих аспектів многопоточного програмування пов'язаний з обмеженим контролем над використанням потоків операційною системою або CLR-середовищем. Наприклад, написавши блок коду, який створює новий потік виконання, не можна гарантувати, що цей потік запуститься негайно. Замість цього такий код лише просить операційну систему запустити потік, як тільки це буде можливо (зазвичай, коли планувальник потоків добереться до нього). Andrey Gladky KspDevelop@gmail.com 5
  • 6. Потік Більш того, враховуючи, що потоки можуть переміщатися між границями додатків і контекстів, коли це потрібно CLR, ви повинні уявляти, які аспекти програми є змінюванні в потоках (наприклад, піддаються багатопотокового доступу), а які операції - атомарними (змінюванні в потоках операції небезпечні ). Якщо вихідний потік ще не повністю завершив свою операцію, другий вхідний потік може побачити об'єкт в частково зміненому стані. У цей момент другий потік, по суті, читає фіктивні дані, що безумовно може призвести до дуже дивних помилок, знайти і налагодити які навіть ще важче. Andrey Gladky KspDevelop@gmail.com 6
  • 7. Багатопоточні додатки Хоча платформа .NET не може повністю приховати складності, пов'язані з побудовою надійних багатопоточних додатків, цей процес все ж значно спрощений. Використовуючи типи, визначені всередині простору імен System.Threading, бібліотеку Task Parallel Library (TPL) в .NET 4.0 і вище, а також ключові слова asinc і await мови C# в .NET 4.5, можна працювати з безліччю потоків, прикладаючи мінімальні зусилля. Andrey Gladky KspDevelop@gmail.com 7
  • 8. namespase System.Threading Andrey Gladky KspDevelop@gmail.com 8 Тип Призначення Interlocked Цей тип надає атомарні операції для змінних, розділених між декількома потоками Monitor Цей тип забезпечує синхронізацію потокових об'єктів, використовуючи блокування і очікування/сигнали. Ключове слово lock мови C # застосовує "за лаштунками" об'єкт Monitor Mutex Цей примітив синхронізації може використовуватися для синхронізації між границями доменів додатків Parameterized ThreadStart Цей делегат дозволяє потоку викликати методи, які приймають довільну кількість аргументів Semaphore Цей тип дозволяє обмежити кількість потоків, які можуть мати доступ до ресурсу або до певного типу ресурсів одночасно Thread Цей тип являє потік, що виконується в CLR-середовищі. Використовуючи етоттіп, можна порождатьдополнітельние потоки в вихідному домені додатку ThreadPool Цей тип дозволяє взаємодіяти з підтримуваним CLR пулом потоків всередині заданого процесу
  • 9. namespase System.Threading Andrey Gladky KspDevelop@gmail.com 9 Тип Призначення ThreadPriority Це перерахування представляє рівень пріоритету потоку (Highest, Normal і т.д.) ThreadStart Цей делегат дозволяє вказати метод для виклику в заданому потоці. На відміну отделегата ParametrizedThreadStart, цільові методи ThreadStart завжди повинні мати один і той же прототип ThreadState Це перерахування задає допустимі стану потоку (Running, Aborted і т.д.) Timer Цей тип надає механізм виконання методу через зазначені інтервали часу TimerCallback Цей тип делегата використовується в поєднанні з типами Timer
  • 10. Статичні члени класу Thread Andrey Gladky KspDevelop@gmail.com 10 Тип Призначення CurrentContext Ця властивість, призначена тільки для читання, повертає контекст, в якому в даний момент виконується потік CurrentThread Це властивість, призначена тільки для читання, повертає посилання на поточний виконуванийя потік GetDomain() GetDomainID() Цей метод повертає посилання на поточний домен додатка або ідентифікатор домену, в якому виконується поточний потік Sleep() Цей метод призупиняє поточний потік на зазначений час
  • 11. Члени рівня екземпляра класу Thread Andrey Gladky KspDevelop@gmail.com 11 Тип Призначення IsAlive Повертає буливське значення, яке вказує на те, чи запущений потік (і поки ще не перерваний і не скасований) IsBackground Отримує або встановлює значення, яке вказує, чи є даний потік фоновим Name Дозволяє встановити дружнє текстове ім'я потоку Priority Отримує або встановлює пріоритет потоку, який може приймати значення з перерахування ThreadPriority ThreadState Отримує стан даного потоку, яке може приймати значення з перерахування ThreadState
  • 12. Члени рівня екземпляра класу Thread Andrey Gladky KspDevelop@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, при першій же можливості. Andrey Gladky KspDevelop@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); } Andrey Gladky KspDevelop@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); } Andrey Gladky KspDevelop@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, можна просто викликати асинхронно і забути. Andrey Gladky KspDevelop@gmail.com 18
  • 19. Синхронізація викликаючого потоку Щоб дозволити викликаючому потоку з'ясовувати, чи завершив свою роботу асинхронно викликаний метод, в інтерфейсі IAsyncResult передбачено властивість IsCompleted. З її допомогою викликаючий потік може визначати, чи дійсно асинхронний виклик був завершений, перш ніж звертатися до EndInvoke(). Якщо метод ще не завершився, властивість IsCompleted повертає false, Andrey Gladky KspDevelop@gmail.com 19
  • 20. Роль делегата AsyncCallback Замість опитування делегата з метою визначення, чи завершився асинхронно викликаний метод, було б більш ефективно змусити вторинний потік інформувати викликаючий потік про завершення виконання завдання. Щоб включити таку поведінку, знадобиться передати методу BeginInvoke() екземпляр делегата System.AsyncCallback. Коли передаєтся об'ект AsyncCallback, делегат буде автоматично викликати вказаний метод по завершенні асинхронного виклику. Метод зворотного виклику буде викликаний у вторинному потоці, а не в первинному. Andrey Gladky KspDevelop@gmail.com 20
  • 21. Передача і отримання спеціальних даних стану Фінальним аспектом асинхронних делегатів, який повинен бути врахований, є останній аргумент методу BeginInvoke(). Цей параметр дозволяє передавати додаткову інформацію про стан методу зворотного виклику з первинного потоку. Для отримання цих даних в контексті методу зворотного виклику використовується властивість AsyncState вхідного параметра IAsyncResult. Andrey Gladky KspDevelop@gmail.com 21