Оглавление
Предисловие ............................................................................................. 10
Для кого написана эта книга .......................................................................11
Почему я написал эту книгу ........................................................................12
Типографские соглашения ..........................................................................13
Структура книги ..........................................................................................13
Благодарности ............................................................................................14
От издательства ..........................................................................................15
Глава 1. Конкурентность: общие сведения ......................................................16
Знакомство с конкурентностью ...................................................................16
Введение в асинхронное программирование ..............................................19
Введение в параллельное программирование .............................................25
Введение в реактивное программирование (Rx) ..........................................30
Введение в Dataflow ....................................................................................32
Введение в многопоточное программирование............................................35
Коллекции для конкурентных приложений ..................................................36
Современная разработка .............................................................................37
О ключевых технологиях кратко .................................................................38
Глава 2. Основы async ....................................................................................39
2.1. Приостановка на заданный период времени .........................................39
2.2. Возвращение завершенных задач .........................................................42
2.3. Передача информации о ходе выполнения операции ...........................45
2.4. Ожидание завершения группы задач ....................................................47
2.5. Ожидание завершения любой задачи ...................................................50
2.6. Обработка задач при завершении ........................................................52
2.7. Обход контекста при продолжении .......................................................56
2.8. Обработка исключений из методов async Task ......................................57
2.9. Обработка исключений из методов async void ......................................59
2.10. Создание ValueTask .............................................................................62
2.11. Потребление ValueTask .......................................................................64
6 Оглавление
Глава 3. Асинхронные потоки .........................................................................68
Асинхронные потоки и Task .................................................................68
Асинхронные потоки и IEnumerable ......................................................69
Асинхронные потоки и Task> ...........................................69
Асинхронные потоки и IObservable .......................................................70
Итоги ..........................................................................................................70
3.1. Создание асинхронных потоков ............................................................72
3.2. Потребление асинхронных потоков ......................................................75
3.3. Использование LINQ с асинхронными потоками....................................77
3.4. Асинхронные потоки и отмена ..............................................................81
Глава 4. Основы параллельного программирования........................................85
4.1. Параллельная обработка данных ..........................................................85
4.2. Параллельное агрегирование ...............................................................88
4.3. Параллельный вызов ............................................................................90
4.4. Динамический параллелизм .................................................................91
4.5. Parallel LINQ .........................................................................................94
Глава 5. Основы Dataflow ................................................................................97
5.1. Связывание блоков...............................................................................97
5.2. Распространение ошибок......................................................................99
5.3. Удаление связей между блоками ........................................................102
5.4. Регулирование блоков ........................................................................103
5.5. Параллельная обработка с блоками потока данных ............................104
5.6. Создание собственных блоков ............................................................106
Глава 6. Основы System.Reactive ...................................................................108
6.1. Преобразование событий .NET............................................................109
6.2. Отправка уведомлений контексту .......................................................112
6.3. Группировка данных событий с использованием Window и Buffer .......115
6.4. Контроль потоков событий посредством регулировки и выборки ........118
6.5. Тайм-ауты ..........................................................................................120
Глава 7. Тестирование ..................................................................................124
7.1. Модульное тестирование async-методов .............................................125
7.2. Асинхронные методы модульного тестирования,
которые не должны проходить ..................................................................128
7.3. Модульное тестирование методов async void ......................................131
7.4. Модульное тестирование сетей потоков данных .................................132
7.5. Модульное тестирование наблюдаемых объектов System.Reactive ......134
7.6. Модульное тестирование наблюдаемых объектов System.Reactive
с использованием имитации планирования ...............................................137
Оглавление 7
Глава 8. Взаимодействие ..............................................................................142
8.1. Асинхронные обертки для «Async»-методов
с «Completed»-событиями .........................................................................142
8.2. Асинхронные обертки для методов «Begin/End» .................................144
8.3. Асинхронные обертки для чего угодно ...............................................146
8.4. Асинхронные обертки для параллельного кода ..................................148
8.5. Асинхронные обертки для наблюдаемых объектов System.Reactive ....149
8.6. Наблюдаемые обертки для асинхронного кода в System.Reactive .......151
8.7. Асинхронные потоки и сети потоков данных .......................................153
8.8. Наблюдаемые объекты System.Reactive Observables
и сети потока данных ...............................................................................156
8.9. Преобразование наблюдаемых объектов System.Reactive
в асинхронные потоки ...............................................................................158
Глава 9. Коллекции .......................................................................................162
9.1. Неизменяемые стеки и очереди ..........................................................164
9.2. Неизменяемые списки ........................................................................167
9.3. Неизменяемые множества ..................................................................169
9.4. Неизменяемые словари ......................................................................172
9.5. Потокобезопасные словари ................................................................174
9.6. Блокирующие очереди .......................................................................177
9.7. Блокирующие стеки и мультимножества .............................................180
9.8. Асинхронные очереди ........................................................................182
9.9. Регулировка очередей ........................................................................186
9.10. Выборка в очередях .........................................................................189
9.11. Асинхронные стеки и мультимножества ............................................191
9.12. Блокирующие/асинхронные очереди ................................................193
Глава 10. Отмена ..........................................................................................199
10.1. Выдача запросов на отмену ..............................................................200
10.2. Реагирование на запросы на отмену посредством
периодического опроса .............................................................................204
10.3. Отмена по тайм-ауту.........................................................................206
10.4. Отмена async-кода ............................................................................208
10.5. Отмена параллельного кода .............................................................209
10.6. Отмена кода System.Reactive ............................................................211
10.7. Отмена сетей потоков данных ..........................................................213
10.8. Внедрение запросов на отмену .........................................................215
10.9. Взаимодействие с другими системами отмены ..................................217
8 Оглавление
Глава 11. ООП, хорошо сочетающееся с функциональным
программированием .......................................................................................219
11.1. Асинхронные интерфейсы и наследование .......................................220
11.2. Асинхронное конструирование: фабрики ..........................................222
11.3. Асинхронное конструирование: паттерн асинхронной инициализации ....224
11.4. Асинхронные свойства ......................................................................228
11.5. async-события ..................................................................................232
11.6. Асинхронное освобождение ..............................................................236
Глава 12. Синхронизация..............................................................................240
12.1. Блокировки и команда lock ...............................................................246
12.2. Блокировки с async ...........................................................................249
12.3. Блокирующие сигналы ......................................................................251
12.4. Асинхронные сигналы .......................................................................253
12.5. Регулировка .....................................................................................255
Глава 13. Планирование ...............................................................................258
13.1. Планирование работы в пуле потоков ..............................................258
13.2. Выполнение кода с помощью планировщика задач ...........................260
13.3. Планирование параллельного кода ..................................................263
13.4. Синхронизация потоков данных с помощью планировщиков ............264
Глава 14. Сценарии ......................................................................................266
14.1. Инициализация совместных ресурсов ...............................................266
14.2. Отложенное вычисление в System.Reactive .......................................270
14.3. Асинхронное связывание данных ......................................................272
14.4. Неявное состояние ...........................................................................275
14.5. Идентичный синхронный и асинхронный код ....................................278
14.6. «Рельсовое» программирование с сетями потоков данных ...............280
14.7. Регулировка обновлений о ходе выполнения операции .....................283
Приложение А. Поддержка унаследованных платформ ...............................289
Поддержка async на старых платформах ..................................................290
Поддержка Dataflow на старых платформах...............................................290
Поддержка System.Reactive на старых платформах....................................291
Приложение Б. Распознавание и интерпретация асинхронных паттернов ....292
Асинхронный паттерн на основе Task (TAP) ..............................................293
Модель асинхронного программирования (APM) .......................................294
Об авторе ................................................................................................. 301
Об обложке ............................................................................................. 302