Svitla .Net meetup in Kiev, Anzhiiak Oleksii

29
KIEV MEETUP

Transcript of Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Page 1: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

KIEV

MEETUP

Page 2: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Потоки.Синхронизация.Асинхронность.

TPL.

Page 3: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Потоки

Процесс в системе может иметь один или более

потоков.

Процесс может решать более одной задачи

одновременно.

Многозадачность на основе потоков означает

параллельное выполнение отдельных частей

программы.

Page 4: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

System.Threading

System.Threading – пространство имен для работы

с потоками, содержит классы для управления

потоками, такие как:

Thread, Monitor, Interlocked

Page 5: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Thread

Класс Thread, представляет собой поток. Он

позволяет создавать новые потоки, управлять

приоритетом потоков и получать информацию о

всех потоках, существующих в рамках приложения.

Page 6: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Состояние потока

Page 7: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Thread

Имя Описание

Join()Блокирует вызывающий поток до завершения потока, продолжая обрабатывать стандартные сообщения COM и SendMessage.

Join(Int32)Блокирует вызывающий поток до завершения потока или истечения указанного времени, продолжая обрабатывать стандартные сообщения COM и SendMessage.

Join(TimeSpan)

Блокирует вызывающий поток до завершения потока или истечения указанного времени, продолжая обрабатывать стандартные сообщения COM и SendMessage.

Start()Вынуждает операционную систему изменить состояние текущего экземпляра на ThreadState.Running.

Start(Object)

Заставляет операционную систему изменить состояние текущего экземпляра на ThreadState.Running, а также (необязательно) передает объект с данными, используемыми методом в потоке.

Page 8: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

ThreadStart

Делегат ThreadStart представляет метод, который

выполняется в указанном потоке Thread.

ThreadStart не позволяет передавать данные в

поток.

Page 9: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

ParameterizedThreadStart

Делегат ParameterizedThreadStart представляет

метод, который выполняется в указанном потоке

Thread.

ParameterizedThreadStart позволяет передавать

данные в поток упакованные в object.

Page 10: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Thread

Имя Описание

Abort()Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов данного метода обычно завершает поток.

Abort(Object)Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов данного метода обычно завершает поток.

ResetAbort Отменяет метод Abort, запрошенный для текущего потока.

Sleep(Int32) Приостанавливает работу текущего потока на заданное время.

Sleep(TimeSpan) Блокирует текущий поток на заданное время.

Page 11: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Thread

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

lock (obj){

DoSomething();}

object tmp = obj;try{

Monitor.Enter(tmp);DoSomething();

}finally{

Monitor.Exit(tmp);}

Page 12: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Пул потоков

Пул потоков — это коллекция потоков, которые

могут использоваться для выполнения нескольких

задач в фоновом режиме. Пул потоков позволяет

разгрузить главный поток для

асинхронного выполнения других задач .

Page 13: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

ThreadPool

ThreadPool - класс предоставляющий пул потоков,

который может использоваться для выполнения

задач, отправки рабочих элементов, обработки

асинхронного ввода - вывода, ожидания от имени

других потоков и обработки таймеров .

Page 14: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Monitor

Класс Monitor представляет собой механизм для

синхронизации доступа к объектам.

Класс Monitor используется для создания

критических секций .

Page 15: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

WaitHandle

Класс WaitHandle обычно используется в качестве

базового для объектов синхронизации.

Классы, производные от WaitHandle, определяют

механизм сигнализации о предоставлении или

освобождении монопольного доступа к общему

ресурсу.

Page 16: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

EventWaitHandle

Класс EventWaitHandle позволяет потокам

взаимодействовать друг с другом путем передачи

сигналов.

Обычно один или несколько потоков блокируются на

EventWaitHandle до тех пор пока незаблокированные

потоки не вызывают метод Set для освобождения

одного или нескольких заблокированных потоков .

Page 17: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

AutoResetEvent

AutoResetEvent позволяет потокам

взаимодействовать друг с другом путем передачи

сигналов . Как правило, этот класс используется,

когда потокам требуется исключительный доступ к

ресурсу.

Вызов Set сигнализирует событию AutoResetEvent

о необходимости освобождения ожидающего

потока.

Page 18: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

ManualResetEvent

ManualResetEvent позволяет потокам

взаимодействовать друг с другом путем передачи

сигналов. Обычно это взаимодействие касается

задачи, которую один поток должен завершить до

того, как другой продолжит работу.

ManualResetEvent остается в сигнальном состоянии

до того момента, как оно будет снова установлено

вручную. То есть, вызовы к WaitOne немедленно

возвращаются .

Page 19: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Mutex

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

эксклюзивный доступ к общему ресурсу только

одному потоку.

Page 20: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Semaphore

Класс Semaphore используется для управления

доступом к пулу ресурсов.

Потоки производят вход в семафор, вызывая метод

WaitOne , унаследованный от класса WaitHandle, и

освобождают семафор вызовом метода Release.

Page 21: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

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

Делегаты позволяют вызывать синхронные методы

асинхронно.

При вызове метода BeginInvoke() , метод сообщенный с

делегатом помещается в пул потоков и вызывается

асинхронно .

В методе обратного вызова метод EndInvoke() получает

возвращаемое значение и любые входные и выходные

параметры или только выходные параметры.

Page 22: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

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

Платформа .NET Framework предоставляет два шаблона

разработки для асинхронных операций:

• асинхронные операции, использующие объекты

IAsyncResult;

• асинхронные операции, использующие события.

Page 23: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

IAsyncResult

С помощью интерфейса IAsyncResult, определяется

состояние выполнения асинхронной операции.

Класс AsyncResult инкапсулирует результаты асинхронной

операции над делегатом.

Делегат AsyncCallback представляет метод обратного

вызова, который вызывается при завершении асинхронной

операции.

Page 24: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Task Parallel Library

Библиотека параллельных задач (TPL) предназначена

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

упрощения процесса добавления параллелизма в

приложения.

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

секционирование работы, планирование потоков в пуле

ThreadPool, поддержка отмены, управление состоянием и

выполняются другие низкоуровневые задачи.

Page 25: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Task Parallel Library

Библиотека параллельных задач (TPL) представляет собой

набор открытых типов и API - интерфейсов в пространствах

имен System.Threading и System.Threading.Tasks

Класс Task - представляет асинхронную операцию.

Класс Task<TResult > - представляет асинхронную

операцию, которая может вернуть значение.

Page 26: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

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

Обновление UI из другого потока через

SynchronizationContext

var sync = SynchronizationContext.Current;

req.BeginGetResponse(asyncResult=>{

var resp= (HttpWebResponse)req.EndGetResponse(asyncResult);sync.Post(

delegate{ // ОБНОВЛЕНИЕ UI }, null);

, null);};

Page 27: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Async Await

Ключевое слово async указывает компилятору, что метод,

является асинхронным.

await указывает компилятору, что в этой точке необходимо

дождаться окончания асинхронной операции

(при этом управление возвращается вызвавшему методу).

Page 28: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

Async Await

Task.WhenAll() , Task.WhenAny()

var wс1 = new WebClient();var wс2 = new WebClient();Task<string> task1 =

wc1.DownloadStringTaskAsync(url1); Task<string> task2 =

wc2.DownloadStringTaskAsync(url2);…string[] results = await Task.WhenAll(task1,task2);

Page 29: Svitla .Net meetup in Kiev, Anzhiiak Oleksii

спасибо