Потоки. Асинхронное и параллельное программирование

Содержание

Слайд 2

Формы параллельных вычислений Конкурентное исполнение (concurrency) - это наиболее общий термин,

Формы параллельных вычислений

Конкурентное исполнение (concurrency)  - это наиболее общий термин, который

говорит, что одновременно выполняется более одной задачи.
Параллельное исполнение (parallel execution) подразумевает наличие более одного вычислительного устройства (например, процессора), которые будут одновременно выполнять несколько задач.
Слайд 3

Формы параллельных вычислений Многопоточное исполнение (multithreading) - это один из способов

Формы параллельных вычислений

Многопоточное исполнение (multithreading) - это один из способов реализации

конкурентного исполнения путем выделения абстракции "рабочего потока" (worker thread).
Асинхронное исполнение (asynchrony) подразумевает, что операция может быть выполнена кем-то на стороне: удаленным веб-узлом, сервером или другим устройством за пределами текущего вычислительного устройства.
Слайд 4

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

Многопоточность

Поток (thread) представляет собой независимую последовательность инструкций в программе. 
Многопоточность подразумевает использование множества

потоков для обработки данных.
Слайд 5

Задачи многопоточности Выполнение долгой задачи в отдельном потоке; Освобождение интерфейса на время выполнения задачи.

Задачи многопоточности

Выполнение долгой задачи в отдельном потоке;
Освобождение интерфейса на время выполнения

задачи.
Слайд 6

Пространство имен System.Threading Пространство имен System.Threading содержит классы и интерфейсы, которые

Пространство имен System.Threading

Пространство имен System.Threading содержит классы и интерфейсы, которые дают возможность программировать в

многопоточном режиме. 
Слайд 7

Отдельный поток - класс Thread Класс Thread определяет ряд методов и

Отдельный поток - класс Thread

Класс Thread определяет ряд методов и свойств, которые

позволяют управлять потоком и получать информацию о нем. Основные свойства класса:
Статическое свойство CurrentThread возвращает ссылку на выполняемый поток
Свойство IsAlive указывает, работает ли поток в текущий момент
Свойство IsBackground указывает, является ли поток фоновым
Свойство Name содержит имя потока
Свойство Priority хранит приоритет потока - значение перечисления ThreadPriority
Свойство ThreadState возвращает состояние потока - одно из значений перечисления ThreadState
Слайд 8

Отдельный поток - класс Thread Методы класса Thread: Статический метод Sleep

Отдельный поток - класс Thread

Методы класса Thread:
Статический метод Sleep останавливает поток на определенное количество

миллисекунд
Метод Abort уведомляет среду CLR о том, что надо прекратить поток, однако прекращение работы потока происходит не сразу, а только тогда, когда это становится возможно. Метод Join блокирует выполнение вызвавшего его потока до тех пор, пока не завершится поток, для которого был вызван данный метод
Метод Resume возобновляет работу ранее приостановленного потока
Метод Start запускает поток
Слайд 9

Получение информации о потоке

Получение информации о потоке

Слайд 10

Статус потока - перечислении ThreadState Aborted: поток остановлен, но пока еще

Статус потока - перечислении ThreadState

Aborted: поток остановлен, но пока еще окончательно не

завершен
AbortRequested: для потока вызван метод Abort, но остановка потока еще не произошла
Background: поток выполняется в фоновом режиме
Running: поток запущен и работает (не приостановлен)
Stopped: поток завершен
StopRequested: поток получил запрос на остановку
Suspended: поток приостановлен
SuspendRequested: поток получил запрос на приостановку
Unstarted: поток еще не был запущен
WaitSleepJoin: поток заблокирован в результате действия методов Sleep или Join
Слайд 11

Работа с потоком

Работа с потоком

Слайд 12

Работа с параметрами

Работа с параметрами

Слайд 13

Синхронизация потоков Для синхронизации используется ключевое слово lock. Оператор lock определяет

Синхронизация потоков

Для синхронизации используется ключевое слово lock. Оператор lock определяет блок кода, внутри которого

весь код блокируется и становится недоступным для других потоков до завершения работы текущего потока. 
Слайд 14

Слайд 15

Пространство имен System.Threading.Tasks Данная библиотека позволяет распараллелить задачи и выполнять их

Пространство имен System.Threading.Tasks

Данная библиотека позволяет распараллелить задачи и выполнять их сразу на

нескольких процессорах, если на целевом компьютере имеется несколько ядер.
Слайд 16

Класс Task Данный класс описывает отдельную задачу, которая запускается в отдельном

Класс Task

Данный класс описывает отдельную задачу, которая запускается в отдельном потоке.
Класс Task в

качестве параметра принимает делегат Action. Этот делегат имеет определение public delegate void Action() . 
Слайд 17

Слайд 18

Ожидание выполнения Если необходимо дождаться выполнения задачи, то используют метод – Wait().

Ожидание выполнения

Если необходимо дождаться выполнения задачи, то используют метод – Wait().

Слайд 19

Работа с класом Task Конструктор класса Task принимает в качестве параметра

Работа с класом Task

Конструктор класса Task принимает в качестве параметра делегат Action или Action.
Свойства:
AsyncState:
возвращает объект состояния задачи
CurrentId: возвращает идентификатор текущей задачи
Exception: возвращает объект исключения, возникшего при выполнении задачи
Status: возвращает статус задачи
Слайд 20

Слайд 21

Возвращение результата

Возвращение результата

Слайд 22

Aсинхронное программирование Асинхронность позволяет вынести отдельные задачи из основного потока с

Aсинхронное программирование

Асинхронность позволяет вынести отдельные задачи из основного потока с специальные

асинхронные методы или блоки кода. Особенно это актуально в графических программах, где продолжительные задачи могу блокировать интерфейс пользователя.
Слайд 23

Асинхронный вызов Чтобы вызвать делегат в асинхронном режиме необходимо использовать метод BeginInvoke/EndInvoke.

Асинхронный вызов

Чтобы вызвать делегат в асинхронном режиме необходимо использовать метод BeginInvoke/EndInvoke.

Слайд 24

Слайд 25

BeginInvoke Параметры: Параметры метода вызываемого делегата. Делегат System.AsyncCallback. AsyncCallback указывает на

BeginInvoke

Параметры:
Параметры метода вызываемого делегата.
Делегат System.AsyncCallback. AsyncCallback указывает на метод, который будет выполняться

в результате завершения работы асинхронного делегата.
Второй параметр представляет произвольный объект, с помощью которого мы можем передать дополнительную информацию в метод завершения.
Слайд 26

Слайд 27

Слайд 28

Ключевые слова async и await В .NET 4.5 во фреймворк были

Ключевые слова async и await

В .NET 4.5 во фреймворк были добавлены

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