3. Потоки
Процесс в системе может иметь один или более
потоков.
Процесс может решать более одной задачи
одновременно.
Многозадачность на основе потоков означает
параллельное выполнение отдельных частей
программы.
4. System.Threading
System.Threading – пространство имен для работы
с потоками, содержит классы для управления
потоками, такие как:
Thread, Monitor, Interlocked
5. Thread
Класс Thread, представляет собой поток. Он
позволяет создавать новые потоки, управлять
приоритетом потоков и получать информацию о
всех потоках, существующих в рамках приложения.
7. Thread
Имя Описание
Join()
Блокирует вызывающий поток до завершения потока, продолжая
обрабатывать стандартные сообщения COM и SendMessage.
Join(Int32)
Блокирует вызывающий поток до завершения потока или истечения
указанного времени, продолжая обрабатывать стандартные
сообщения COM и SendMessage.
Join(TimeSpan)
Блокирует вызывающий поток до завершения потока или истечения
указанного времени, продолжая обрабатывать стандартные
сообщения COM и SendMessage.
Start()
Вынуждает операционную систему изменить состояние текущего
экземпляра на ThreadState.Running.
Start(Object)
Заставляет операционную систему изменить состояние текущего
экземпляра на ThreadState.Running, а также (необязательно)
передает объект с данными, используемыми методом в потоке.
8. ThreadStart
Делегат ThreadStart представляет метод, который
выполняется в указанном потоке Thread.
ThreadStart не позволяет передавать данные в
поток.
10. Thread
Имя Описание
Abort()
Вызывает исключение ThreadAbortException в вызвавшем его
потоке для того, чтобы начать процесс завершения
потока. Вызов данного метода обычно завершает поток.
Abort(Object)
Вызывает исключение ThreadAbortException в вызвавшем его
потоке для того, чтобы начать процесс завершения
потока. Вызов данного метода обычно завершает поток.
ResetAbort Отменяет метод Abort, запрошенный для текущего потока.
Sleep(Int32) Приостанавливает работу текущего потока на заданное время.
Sleep(TimeSpan) Блокирует текущий поток на заданное время.
11. Thread
При помощи ключевого слова lock, блок операторов можно пометить
как критическую секцию, получив блокировку взаимного исключения
для указанного объекта синхронизации доступа, выполнить действия с
общим ресурсом, а затем снять блокировку.
lock (obj)
{
DoSomething();
}
object tmp = obj;
try
{
Monitor.Enter(tmp);
DoSomething();
}
finally
{
Monitor.Exit(tmp);
}
12. Пул потоков
Пул потоков — это коллекция потоков, которые
могут использоваться для выполнения нескольких
задач в фоновом режиме. Пул потоков позволяет
разгрузить главный поток для
асинхронного выполнения других задач .
13. ThreadPool
ThreadPool - класс предоставляющий пул потоков,
который может использоваться для выполнения
задач, отправки рабочих элементов, обработки
асинхронного ввода - вывода, ожидания от имени
других потоков и обработки таймеров .
14. Monitor
Класс Monitor представляет собой механизм для
синхронизации доступа к объектам.
Класс Monitor используется для создания
критических секций .
15. WaitHandle
Класс WaitHandle обычно используется в качестве
базового для объектов синхронизации.
Классы, производные от WaitHandle, определяют
механизм сигнализации о предоставлении или
освобождении монопольного доступа к общему
ресурсу.
16. EventWaitHandle
Класс EventWaitHandle позволяет потокам
взаимодействовать друг с другом путем передачи
сигналов.
Обычно один или несколько потоков блокируются на
EventWaitHandle до тех пор пока незаблокированные
потоки не вызывают метод Set для освобождения
одного или нескольких заблокированных потоков .
17. AutoResetEvent
AutoResetEvent позволяет потокам
взаимодействовать друг с другом путем передачи
сигналов . Как правило, этот класс используется,
когда потокам требуется исключительный доступ к
ресурсу.
Вызов Set сигнализирует событию AutoResetEvent
о необходимости освобождения ожидающего
потока.
18. ManualResetEvent
ManualResetEvent позволяет потокам
взаимодействовать друг с другом путем передачи
сигналов. Обычно это взаимодействие касается
задачи, которую один поток должен завершить до
того, как другой продолжит работу.
ManualResetEvent остается в сигнальном состоянии
до того момента, как оно будет снова установлено
вручную. То есть, вызовы к WaitOne немедленно
возвращаются .
19. Mutex
Mutex — примитив, который предоставляет
эксклюзивный доступ к общему ресурсу только
одному потоку.
20. Semaphore
Класс Semaphore используется для управления
доступом к пулу ресурсов.
Потоки производят вход в семафор, вызывая метод
WaitOne , унаследованный от класса WaitHandle, и
освобождают семафор вызовом метода Release.
21. Асинхронное программирование
Делегаты позволяют вызывать синхронные методы
асинхронно.
При вызове метода BeginInvoke() , метод сообщенный с
делегатом помещается в пул потоков и вызывается
асинхронно .
В методе обратного вызова метод EndInvoke() получает
возвращаемое значение и любые входные и выходные
параметры или только выходные параметры.
22. Асинхронное программирование
Платформа .NET Framework предоставляет два шаблона
разработки для асинхронных операций:
• асинхронные операции, использующие объекты
IAsyncResult;
• асинхронные операции, использующие события.
23. IAsyncResult
С помощью интерфейса IAsyncResult, определяется
состояние выполнения асинхронной операции.
Класс AsyncResult инкапсулирует результаты асинхронной
операции над делегатом.
Делегат AsyncCallback представляет метод обратного
вызова, который вызывается при завершении асинхронной
операции.
24. Task Parallel Library
Библиотека параллельных задач (TPL) предназначена
для повышения производительности разработчиков за счет
упрощения процесса добавления параллелизма в
приложения.
В библиотеке параллельных задач осуществляется
секционирование работы, планирование потоков в пуле
ThreadPool, поддержка отмены, управление состоянием и
выполняются другие низкоуровневые задачи.
25. Task Parallel Library
Библиотека параллельных задач (TPL) представляет собой
набор открытых типов и API - интерфейсов в пространствах
имен System.Threading и System.Threading.Tasks
Класс Task - представляет асинхронную операцию.
Класс Task<TResult > - представляет асинхронную
операцию, которая может вернуть значение.
26. Асинхронное программирование
Обновление UI из другого потока через
SynchronizationContext
var sync = SynchronizationContext.Current;
req.BeginGetResponse(
asyncResult=>
{
var resp= (HttpWebResponse)req.EndGetResponse(asyncResult);
sync.Post(
delegate
{ // ОБНОВЛЕНИЕ UI }, null);
, null);};
27. Async Await
Ключевое слово async указывает компилятору, что метод,
является асинхронным.
await указывает компилятору, что в этой точке необходимо
дождаться окончания асинхронной операции
(при этом управление возвращается вызвавшему методу).
28. 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);