Большинство разработчиков настороженно относятся к конкурентному и многопоточному программированию, опасаясь проблем связанных с взаимной блокировкой, голоданием и др. Стивен Клири поможет разобраться с трудностями и избежать подводных камней, возникающих при решении реальных задач. В вашем распоряжении 85 рецептов работы с .NET и C# 8.0, необходимых для параллельной обработки и асинхронного программирования.
Конкурентность уже стала общепринятым методом разработки хорошо масштабируемых приложений, но параллельное программирование остается непростой задачей. Подробные примеры и комментарии к коду позволят разобраться в том, как современные инструменты повышают уровень абстракции и упрощают конкурентное программирование.
Вы научитесь:
• использовать async и await для асинхронных операций
• расширять возможности кода за счет использования асинхронных потоков
• исследовать потенциал параллельного программирования с библиотекой TPL Dataflow
• создавать конвейеры потоков данных с библиотекой TPL Dataflow
• задействовать функциональность System.Reactive на базе LINQ
• использовать потоково-безопасные и неизменяемые коллекции
• проводить модульное тестирование конкурентного кода
• брать под контроль пул потоков
• реализовывать корректную кооперативную отмену
• анализировать сценарии на предмет объединения конкурентных методов
• пользоваться всеми возможностями асинхронно-совместимого объектно-ориентированного программирования
• распознавать и создавать адаптеры для кода, в котором используются старые стили асинхронного программирования.
Author(s): Стивен Клири
Series: Бестселлеры O’REILLY
Edition: 2
Publisher: Питер
Year: 2020
Language: Russian
Commentary: True PDF
Pages: 272
City: СПб.
Tags: Multithreading; C#; Concurrency; Asynchronous Programming; Parallel Programming; Cookbook; Reactive Programming; Application Development; Object-Oriented Programming; Unit Testing; Scheduling
Предисловие
Для кого написана эта книга
Почему я написал эту книгу
Типографские соглашения
Структура книги
Благодарности
От издательства
Глава 1. Конкурентность: общие сведения
Знакомство с конкурентностью
Введение в асинхронное программирование
Введение в параллельное программирование
Введение в реактивное программирование (Rx)
Введение в Dataflow
Введение в многопоточное программирование
Коллекции для конкурентных приложений
Современная разработка
О ключевых технологиях кратко
Глава 2.
Основы async
2.1. Приостановка на заданный период времени
2.2. Возвращение завершенных задач
2.3. Передача информации о ходе выполнения операции
2.4. Ожидание завершения группы задач
2.5. Ожидание завершения любой задачи
2.6. Обработка задач при завершении
2.7. Обход контекста при продолжении
2.8. Обработка исключений из методов async Task
2.9. Обработка исключений из методов async void
2.10. Создание ValueTask
2.11. Потребление ValueTask
Асинхронные потоки
Асинхронные потоки и Task
Асинхронные потоки и Task>
Асинхронные потоки и IObservable
Итоги
3.1. Создание асинхронных потоков
3.2. Потребление асинхронных потоков
3.3. Использование LINQ с асинхронными потоками
3.4. Асинхронные потоки и отмена
Глава 4.
Основы параллельного программирования
4.1. Параллельная обработка данных
4.2. Параллельное агрегирование
4.3. Параллельный вызов
4.4. Динамический параллелизм
4.5. Parallel LINQ
Глава 5. Основы Dataflow
5.1. Связывание блоков
5.2. Распространение ошибок
5.3. Удаление связей между блоками
5.4. Регулирование блоков
5.5. Параллельная обработка с блоками потока данных
5.6. Создание собственных блоков
Глава 6.
Основы System.Reactive
6.1. Преобразование событий .NET
6.2. Отправка уведомлений контексту
6.3. Группировка данных событий с использованием Window и Buffer
6.4. Контроль потоков событий посредством регулировки и выборки
6.5. Тайм-ауты
Глава 7.
Тестирование
7.1. Модульное тестирование async-методов
7.2. Асинхронные методы модульного тестирования, которые не должны проходить
7.3. Модульное тестирование методов async void
7.4. Модульное тестирование сетей потоков данных
7.5. Модульное тестирование наблюдаемых объектов System.Reactive
7.6. Модульное тестирование наблюдаемых объектов System.Reactive с использованием имитации планирования
Глава 8.
Взаимодействие
8.1. Асинхронные обертки для «Async»-методов с «Completed»-событиями
8.2. Асинхронные обертки для методов «Begin/End»
8.3. Асинхронные обертки для чего угодно
8.4. Асинхронные обертки для параллельного кода
8.5. Асинхронные обертки для наблюдаемых объектов System.Reactive
8.6. Наблюдаемые обертки для асинхронного кода в System.Reactive
8.7. Асинхронные потоки и сети потоков данных
8.8. Наблюдаемые объекты System.Reactive Observables и сети потока данных
8.9. Преобразование наблюдаемых объектов System.Reactive в асинхронные потоки
Глава 9.
Коллекции
9.1. Неизменяемые стеки и очереди
9.2. Неизменяемые списки
9.3. Неизменяемые множества
9.4. Неизменяемые словари
9.5. Потокобезопасные словари
9.6. Блокирующие очереди
9.7. Блокирующие стеки и мультимножества
9.8. Асинхронные очереди
9.9. Регулировка очередей
9.10. Выборка в очередях
9.11. Асинхронные стеки и мультимножества
9.12. Блокирующие/асинхронные очереди
Глава 10.
Отмена
10.1. Выдача запросов на отмену
10.2. Реагирование на запросы на отмену посредством периодического опроса
10.3. Отмена по тайм-ауту
10.4. Отмена async-кода
10.5. Отмена параллельного кода
10.6. Отмена кода System.Reactive
10.7. Отмена сетей потоков данных
10.8. Внедрение запросов на отмену
10.9. Взаимодействие с другими системами отмены
Глава 11.
ООП, хорошо сочетающееся с функциональным программированием
11.1. Асинхронные интерфейсы и наследование
11.2. Асинхронное конструирование: фабрики
11.3. Асинхронное конструирование: паттерн асинхронной инициализации
11.4. Асинхронные свойства
11.5. async-события
11.6. Асинхронное освобождение
Глава 12.
Синхронизация
12.1. Блокировки и команда lock
12.2. Блокировки с async
12.3. Блокирующие сигналы
12.4. Асинхронные сигналы
12.5. Регулировка
Глава 13.
Планирование
13.1. Планирование работы в пуле потоков
13.2. Выполнение кода с помощью планировщика задач
13.3. Планирование параллельного кода
13.4. Синхронизация потоков данных с помощью планировщиков
Глава 14.
Сценарии
14.1. Инициализация совместных ресурсов
14.2. Отложенное вычисление в System.Reactive
14.3. Асинхронное связывание данных
14.4. Неявное состояние
14.5. Идентичный синхронный и асинхронный код
14.6. «Рельсовое» программирование с сетями потоков данных
14.7. Регулировка обновлений о ходе выполнения операции
Приложение А.
Поддержка унаследованных платформ
Поддержка async на старых платформах
Приложение Б.
Распознавание и интерпретация асинхронных паттернов
Асинхронный паттерн на основе Task (TAP)
Модель асинхронного программирования (APM)
Об авторе
Об обложке