Вступительное слово от сообщества DotNetRu....21
Иллюстрация на обложке....20
Об авторе....19
О книге....16
Кому адресована эта книга....16
Структура издания....16
О примерах программного кода....17
От издательства....18
Благодарности....14
Предисловие....12
Часть I. Основы асинхронного программирования и многопоточности....23
Глава 1. Асинхронное программирование и многопоточность....24
1.1. Что такое многопоточность....25
1.2. Многоядерные процессоры....28
1.3. Асинхронное программирование....31
1.4. Совместное использование многопоточности и асинхронного программирования....33
1.5. Эффективность программного обеспечения и облачные вычисления....34
Итоги главы....35
Глава 2. Компилятор переписывает ваш код....36
2.1. Лямбда-функции....37
2.2. Инструкция yield return....39
Итоги главы....44
Глава 3. Ключевые слова async и await....45
3.1. Сложность асинхронного кода....46
3.2. Знакомство с Task и Task....48
3.2.1. Мы уже приехали?....50
3.2.2. Разбуди меня, когда приедем....51
3.2.3. Синхронный вариант....52
3.2.4. После завершения задачи....53
3.3. Как работают asyncawait....55
3.4. Асинхронные методы void....60
3.5. ValueTask и ValueTask....62
3.6. А что насчет многопоточности?....63
Итоги главы....63
Глава 4. Основы многопоточности....65
4.1. Способы запуска кода в другом потоке....66
4.1.1. Thread.Start....66
4.1.2. Пул потоков....70
4.1.3. Task.Run....72
4.2. Доступ к одним и тем же переменным из нескольких потоков....75
4.2.1. Отказ от общих данных....77
4.2.2. Неизменяемые общие данные....77
4.2.3. Использование блокировок и мьютексов....78
4.2.4. Взаимоблокировки....80
4.3. Замечания о приложениях с графическим пользовательским интерфейсом....81
4.4. Ожидание другого потока....82
4.5. Другие методы синхронизации....83
4.6. Параметры потока....84
4.6.1. Режим выполнения потока в фоне....85
4.6.2. Язык и локаль....85
4.6.3. COM-апартаменты....85
4.6.4. Текущий пользователь....86
4.6.5. Приоритет потока....86
Итоги главы....86
Глава 5. asyncawait и многопоточность....88
5.1. Асинхронное программирование и многопоточность....89
5.2. Где выполняется код после вызова await....92
5.3. Блокировки и asyncawait....95
5.4. Потоки пользовательского интерфейса....98
Итоги главы....100
Глава 6. Когда использовать asyncawait....101
6.1. Преимущества асинхронности на серверах....102
6.2. Преимущества асинхронности в нативных клиентских приложениях....108
6.3. Недостатки asyncawait....109
6.3.1. Асинхронное программирование заразно....109
6.3.2. Асинхронное программирование имеет больше пограничных случаев....111
6.3.3. Многопоточность имеет еще больше пограничных случаев....112
6.3.4. asyncawait это дорого....112
6.4. Когда использовать asyncawait....113
Итоги главы....114
Глава 7. Классические ловушки многопоточности и как их избежать....115
7.1. Частичное обновление....116
7.2. Изменение порядка доступа к памяти при компиляции....119
7.3. Взаимоблокировки....123
7.4. Состояние гонки....130
7.5. Синхронизация....133
7.6. Голодание....135
Итоги главы....138
Часть II. Продвинутое использование asyncawait и многопоточности....139
Глава 8. Обработка последовательности элементов в фоновом режиме....140
8.1. Параллельная обработка элементов....141
8.1.1. Параллельная обработка элементов с помощью класса Thread....142
8.1.2. Параллельная обработка элементов с использованием пула потоков....144
8.1.3. Асинхронная параллельная обработка элементов....146
8.1.4. Класс Parallel....148
8.2. Последовательная обработка элементов в фоновом режиме....152
8.2.1. Последовательная обработка элементов в фоновом режиме с помощью класса Thread....152
8.2.2. Паттерн очереди заданий и BlockingCollection....154
8.2.3. Обработка важных элементов с помощью постоянных очередей....157
Итоги главы....158
Глава 9. Отмена фоновых заданий....160
9.1. Введение в CancellationToken....160
9.2. Отмена с использованием исключения....168
9.3. Получение обратного вызова, когда вызывающий код отменяет операцию....169
9.4. Реализация тайм-аутов....170
9.5. Комбинирование методов отмены....171
9.6. Специальные токены отмены....172
Итоги главы....172
Глава 10. Ожидаем собственные события....174
10.1. Знакомство с TaskCompletionSource....175
10.2. Выбор потока для запуска продолжения....179
10.3. Пример: ожидание инициализации....180
10.4. Пример: адаптация старых API....182
10.5. Асинхронные операции в старом стиле (BeginXXX, EndXXX)....183
10.6. Пример: асинхронные структуры данных....184
Итоги главы....187
Глава 11. Выбор потока для выполнения асинхронного кода....188
11.1. Поведение await в многопоточной среде....189
11.1.1. await в потоках пользовательского интерфейса....190
11.1.2. await в потоках, отличных от потока пользовательского интерфейса....191
11.2. Контексты синхронизации....193
11.3. Переключение потоков ConfigureAwait(false)....197
11.4. Дополнительные параметры ConfigureAwait....204
11.5. Task.Yield: возможность выполнить другой код....205
11.6. Планировщики задач....207
Итоги главы....209
Глава 12. asyncawait и исключения....211
12.1. Исключения и асинхронный код....211
12.2. await и AggregateException....215
12.3. Потеря исключений....216
12.4. Исключения и методы async void....217
Итоги главы....217
Глава 13. Потокобезопасные коллекции....219
13.1. Проблемы использования обычных коллекций....220
13.2. Потокобезопасные коллекции....225
13.2.1. ConcurrentDictionary....225
13.2.2. BlockingCollection....229
13.2.3. Асинхронные альтернативы BlockingCollection....232
13.2.4. ConcurrentQueue и ConcurrentStack....233
13.2.5. ConcurrentBag....234
13.2.6. Когда следует использовать потокобезопасные коллекции....235
13.2.7. Когда не следует использовать потокобезопасные коллекции....235
13.3. Неизменяемые коллекции....235
13.3.1. Как работают неизменяемые коллекции....236
13.3.2. Как использовать неизменяемые коллекции....242
13.3.3. ImmutableInterlocked....244
13.3.4. ImmutableDictionary....245
13.3.5. ImmutableHashSet и ImmutableSortedSet....246
13.3.6. ImmutableList....247
13.3.7. ImmutableQueue и ImmutableStack....248
13.3.8. ImmutableArray....248
13.3.9. Когда использовать неизменяемые коллекции....250
13.4. Замороженные коллекции....250
13.4.1. Когда использовать замороженные коллекции....252
Итоги главы....252
Глава 14. Асинхронная генерация коллекций await foreach и IAsyncEnumerable....255
14.1. Итерации по асинхронной коллекции....256
14.2. Создание асинхронной коллекции....258
14.3. Отмена итерации по асинхронной коллекции....261
14.4. Другие варианты....264
14.5. IAsyncEnumerable и LINQ....264
14.6. Пример: итерации по данным, получаемым асинхронно....265
14.7. Пример: асинхронная очередь, подобная BlockingCollection....266
Итоги главы....269
Асинхронные и многопоточные программы могут выполнять несколько задач одновременно, не теряя скорости или надежности. Но правильная организация параллельного выполнения может вызвать затруднения даже у опытных разработчиков. Эта практическая книга научит вас создавать параллельные приложения на C#, работающие с максимальной скоростью и не имеющие взаимоблокировок и других проблем синхронизации, которые ухудшают производительность и требуют огромных усилий для их обнаружения.