Потоки .NET

Get Started. It's Free
or sign up with your email address
Потоки .NET by Mind Map: Потоки .NET

1. https://habrahabr.ru/company/nixsolutions/blog/260745/

2. Thread

2.1. Background

2.1.1. Останавливаются автоматом при завершении приложения

2.2. Foreground

2.2.1. Препятствуют завершению программы

2.3. Исключение

2.3.1. В дочернем приведет к завершению приложения

2.3.2. Нужно обрабатывать в самом потоке

2.3.3. Глобальные подписки ловят только свой поток

2.3.3.1. Application.ThreadException (WinForms)

2.3.3.2. Application.DispatcherUnhandledException (WPF)

2.3.3.3. Application_Error (ASP.NET)

2.3.3.4. AppDomain.CurrentDomain.UnhandledException

2.3.3.4.1. Вклиниться в обработку, но не остановить падение

2.4. Создание

2.4.1. Дорого

2.4.2. Долго

2.4.3. Не эффективно

2.4.3.1. Для большого количества маленьких задач

3. ThreadPool

3.1. Принципы

3.1.1. Создается в рамках каждого процесса CLR

3.1.2. Набор потоков в режиме ожидания, готовых к работе

3.1.3. Умный, если нужно добавляет потоки

3.1.4. Background всегда

3.1.5. Блокировка потоков - запуск дополнительных потоков и падение производительности

3.2. Worker

3.2.1. Загрузка CPU

3.3. I/O потоки

3.3.1. Устроства

3.4. Запуск в пуле

3.4.1. Thread.CurrentThread.IsThreadPoolThread

3.4.2. ThreadPool.QueueUserWorkItem

3.4.3. Делегат BeginInvoke() и EndInvoke()

3.4.4. BackgroundWorker

3.4.5. TPL

3.4.6. Тоже используют неявно

3.4.6.1. WCF, Remoting, ASP.NET, ASMX Web Services

3.4.6.2. Timers

3.4.6.3. EAP the event-based asynchronous pattern

3.4.6.4. PLINQ

4. Синхронизация

4.1. Принципы

4.1.1. Гарантировать целосность данных

4.1.2. Разделяемый ресурсы

4.1.2.1. Управляемая куча

4.1.2.2. Ресурсы AppDomain

4.2. 4 вида

4.2.1. Блокировка вызывающего кода

4.2.2. Конструкции, ограничивающие доступ к кускам кода

4.2.3. Сигнализирующие конструкции

4.2.4. Неблокирующая блокировка

4.3. Блокировка

4.3.1. Ожидание одним потоком завершения другого

4.3.1.1. Sleep

4.3.1.1.1. Если надо подождать чуть чуть

4.3.1.1.2. Не часто

4.3.1.2. Join

4.3.1.3. EndInvoke

4.3.1.4. Task

4.3.1.5. Требует много ресурсов

4.3.2. ОС и CLR думают, что поток занят

4.4. Эксклюзивная блокировка

4.4.1. Конструкции

4.4.1.1. Только один поток будет выполнять кусок кода

4.4.1.2. lock Monitor.Enter/Exit

4.4.1.3. Mutex

4.4.1.3.1. Межпроцессная блокировка

4.4.1.4. Semaphor

4.4.1.4.1. Slim

4.4.1.5. ReaderWriterLock

4.4.1.5.1. Slim

4.4.2. static ctor

4.4.2.1. Всегда потокобезопасен

4.4.2.1.1. Вся статика блокируется на время создания

4.4.2.2. Но не статические члены сами по себе, вне конструктора

4.4.3. lock

4.4.3.1. Плохо

4.4.3.1.1. this, typeof,

4.4.3.2. Хорошобы

4.4.3.2.1. Monitor.TryEnter(this.lockObject, 3000)

4.4.4. Interlocked

4.4.4.1. Для атомарных кострукций

4.4.4.1.1. lock (this.lockObject) { this.counter++; }

4.5. Сигнализирующие

4.5.1. остановиться и ожидать пока он не получит извещение из другого потока

4.5.2. AutoResetEvent

4.5.2.1. Разблокируется один поток из ожидающих

4.5.3. ManualResetEvent

4.5.3.1. Slim

4.5.3.2. Разблокирует все сразу

4.5.4. ContdownEvent

4.5.4.1. Разблокируется при получении нужного количества сигналов

4.5.5. Barrier

4.5.6. Wait and Pulse

4.5.6.1. Блокируется до выполнения условия

4.6. Неблокирующая блокировка

4.6.1. Простые операции без блокировок

4.6.2. Без переключения контекстов

4.6.3. Без ожидания потоков

4.6.4. Легко ошибиться

4.6.4.1. Трудноуловмые ошибки

4.6.4.2. Тормоза

4.6.5. Thread.MemoryBarrier()

4.6.5.1. препятствуют оптимизациям, кешированию регистров CPU и перестановкам программных инструкций

4.6.6. volatile

4.6.6.1. помечаются необходимые поля класса

4.6.6.2. Генерирует барьеры памяти при чтении/записи

4.6.6.3. Хорош, если одни потки читают, а другие пишут

4.6.6.4. Плох, если один и читает и пишет

4.6.7. Interlocked

4.6.7.1. имеет довольно много методов для атомарных операций, таких как увеличение, уменьшение, изменение, изменение со сравнением и т.д.

5. Collections

5.1. BlockingCollection

5.2. ConcurrentBag

5.3. ConcurrentDictionary<TKey, TValue>

5.4. ConcurrentQueue

5.5. ConcurrentStack

6. Раньше

6.1. EAP (Event-based Asynchronous Pattern)

6.1.1. MethodNameAsync

6.1.2. event MethodNameCompleted

6.1.3. MethodNameAsyncCancel

6.2. TAP (Task-based Asynchronous Model)

6.2.1. TPL и PLINQ используют TAP

6.2.2. Task<ТResult>

6.2.2.1. Не поток, а операция, которая может быть выполненна асинхронно

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

6.2.4. TaskCreationOptions.LongRunning

6.2.4.1. Если вам нужно запустить длительную операцию и вы не хотите надолго блокировать один из потоков пула

7. async\await

7.1. избегать конструкций вида async void

7.1.1. Исключения нельзя перехватить

7.1.2. ограничены в работе с такими конструкциями

7.1.3. сложно тестировать

7.2. По возможности .ConfigureAwait(false)

7.2.1. Избежать захвата контекста