Файл: Асинхронноепрограммирование.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.11.2023

Просмотров: 133

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Асинхронное
программирование
в C# 5.0
Алекс Дэвис

Алекс Дэвис
Асинхронное
программирование
в C# 5.0

Async in C# 5.0
$OH['DYLHV
Beijing

Cambridge

Farnham

Köln

Sebastopol

Tokyo

Асинхронное
программирование
в C# 5.0
Москва, 2013
Алекс Дэвис

УДК 004.438C#
ББК 32.973.26-018.2
Д94
Д94 Алекс Дэвис
Асинхронное программирование в C# 5.0. / Пер. с англ. Слинкин А. А. –
М.: ДМК Пресс, 2013. – 120 с.: ил.
ISBN 978-5-94074-886-1
Из этого краткого руководства вы узнаете, как механизм async в C# 5.0 позволяет упростить написание асинхронного кода. Помимо ясного введения в асинхронное программирование вообще, вы найдете углубленное описание работы этого конкретного механизма и ответ на вопрос, когда и зачем исполь- зовать его в собственных приложениях.
В книге рассматриваются следующие вопросы.
• Как писать асинхронный код вручную и как механизм async скрывает неприглядные детали.
• Новые способы повышения производительности серверного кода в приложениях ASP.NET.
• Совместная работа async и WinRT в приложениях для Windows 8.
• Смысл ключевого слова await в async-методах.
• В каком потоке .NET исполняется асинхронный код в каждой точке программы.
• Написание асинхронных API, согласованных с паттерном Task-based
Asynchronous Pattern (TAP).
• Распараллеливание программ для задействования возможностей совре- менных компьютеров.
• Измерение производительности async-кода и сравнение с альтернатив- ными подходами.
Книга рассчитана на опытных программистов на C#, но будет понятна и начинающим. Она изобилует примерами кода, который можно использовать в своих программах.
Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но, поскольку вероятность технических ошибок все равно существует, издательство не может гаран- тировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использо- ванием книги.
ISBN 978-1-449-33716-2 (англ.) Authorized Russian translation of the English edi- tion of Async in C# 5.0, ISBN 9781449337162
© 2012 Alex Davies. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.
ISBN 978-5-94074-886-1 (рус.) © Оформление, перевод на русский язык ДМК
Пресс, 2013


ОГЛАВЛЕНИЕ
Предисловие ...............................................9
Предполагаемая аудитория ....................................................... 9
Как читать эту книгу ................................................................. 10
Принятые соглашения ............................................................. 10
О примерах кода...................................................................... 11
Как с нами связаться ............................................................... 11
Благодарности ........................................................................ 12
Об авторе ................................................................................ 12
Глава 1. Введение ....................................... 13
Асинхронное программирование ............................................ 13
Чем так хорош асинхронный код? ............................................ 14
Что такое async? ...................................................................... 15
Что делает async? .................................................................... 15
Async не решает все проблемы ................................................ 17
Глава 2. Зачем делать программу асинхронной ...18
Приложения с графическим интерфейсом пользователя для настольных компьютеров .................................................. 18
Аналогия с кафе ...................................................................... 19
Серверный код веб-приложения ............................................. 20
Еще одна аналогия: кухня в ресторане ..................................... 21
Silverlight, Windows Phone и Windows 8 ..................................... 22
Параллельный код ................................................................... 23
Пример.................................................................................... 24
Глава 3. Написание асинхронного кода вручную ...26
О некоторых асинхронных паттернах в .NET ............................. 26
Простейший асинхронный паттерн .......................................... 28
Введение в класс Task ............................................................. 29
Чем плоха реализация асинхронности вручную? ..................... 30
Переработка примера с использованием написанного вручную асинхронного кода ..................................................... 31

6
Оглавление
Глава 4. Написание асинхронных методов ...... 33
Преобразование программы скачивания значков к виду, использующему async ............................................................. 33
Task и await .............................................................................. 34
Тип значения, возвращаемого асинхронным методом ............. 36
Async, сигнатуры методов и интерфейсы................................. 37
Предложение return в асинхронных методах ............................ 38
Асинхронные методы «заразны» .............................................. 39
Асинхронные анонимные делегаты и лямбда-выражения ........ 40
Глава 5. Что в действительности делает await ...41
Приостановка и возобновление метода ................................... 41
Состояние метода ................................................................... 42
Контекст .................................................................................. 43
Когда нельзя использовать await ............................................. 44
Блоки catch и finally .................................................................. 44
Блоки lock ................................................................................ 45
Выражения LINQ-запросов ....................................................... 46
Небезопасный код ................................................................... 47
Запоминание исключений ....................................................... 47
Асинхронные методы до поры исполняются синхронно ........... 48
Глава 6. Паттерн TAP ................................... 50
Что специфицировано в TAP? .................................................. 50
Использование Task для операций, требующих большого объема вычислений ................................................................. 52
Создание задачи-марионетки ................................................. 53
Взаимодействие с прежними асинхронными паттернами ........ 55
Холодные и горячие задачи ..................................................... 56
Предварительная работа ......................................................... 56
Глава 7. Вспомогательные средства для
асинхронного кода ...................................... 58
Задержка на указанное время ................................................. 58
Ожидание завершения нескольких задач ................................ 59
Ожидание завершения любой задачи из нескольких ............... 61
Создание собственных комбинаторов ..................................... 62
Отмена асинхронных операций ............................................... 64
Информирование о ходе выполнения асинхронной операции ....65
Глава 8. В каком потоке исполняется мой код? ...67
До первого await ...................................................................... 67


7
Оглавление
Во время асинхронной операции ............................................. 68
Подробнее о классе SynchronizationContext ............................. 69
await и SynchronizationContext .................................................. 69
Жизненный цикл асинхронной операции ................................. 70
Когда не следует использовать SynchronizationContext ............ 73
Взаимодействие с синхронным кодом ..................................... 74
Глава 9. Исключения в асинхронном коде ....... 76
Исключения в async-методах, возвращающих Task .................. 76
Незамеченные исключения ..................................................... 78
Исключения в методах типа async void ..................................... 79
Выстрелил и забыл .................................................................. 79
AggregateException и WhenAll ................................................... 80
Синхронное возбуждение исключений .................................... 81
Блок finally в async-методах ..................................................... 82
Глава 10. Организация параллелизма
с помощью механизма async ........................ 83
await и блокировки ................................................................... 83
Акторы ..................................................................................... 85
Использование акторов в C# ................................................... 86
Библиотека Task Parallel Library Dataflow .................................. 87
Глава 11. Автономное тестирование
асинхронного кода ...................................... 90
Проблема автономного тестирования в асинхронном окружении ............................................................................... 90
Написание работающих асинхронных тестов вручную ............. 91
Поддержка со стороны каркаса автономного тестирования .... 91
Глава 12. Механизм async в приложениях
ASP.NET .................................................... 93
Преимущества асинхронного веб-серверного кода ................. 93
Использование async в ASP.NET MVC 4 .................................... 94
Использование async в предыдущих версиях ASP.NET MVC ..... 94
Использование async в ASP.NET Web Forms ............................. 95
Глава 13. Механизм async в приложениях WinRT ... 97
Что такое WinRT? ..................................................................... 97
Интерфейсы IAsyncAction и IAsyncOperation ...................... 98
Отмена .................................................................................... 99

8
Оглавление
Информирование о ходе выполнения ...................................... 99
Реализация асинхронных методов в компоненте WinRT ......... 100
Глава 14. Подробно о преобразовании
асинхронного кода, осуществляемом
компилятором ......................................... 102
Метод-заглушка .................................................................... 102
Структура конечного автомата............................................... 103
Метод MoveNext .................................................................... 105
Наш код.................................................................................. 106
Преобразование предложений return в код завершения ......... 106
Переход в нужное место метода ............................................. 106
Приостановка метода в месте встречи await ........................... 107
Возобновление после await .................................................... 107
Синхронное завершение ........................................................ 107
Перехват исключений ............................................................. 108
Более сложный код ................................................................ 108
Разработка типов, допускающих ожидание ........................... 109
Взаимодействие с отладчиком .............................................. 110
Глава 15. Производительность асинхронного
кода ....................................................... 112
Измерение накладных расходов механизма async ................. 112
Async и блокирующая длительная операция .......................... 113
Оптимизация асинхронного кода для длительной операции .... 116
Async-методы и написанный вручную асинхронный код......... 116
Async и блокирование без длительной операции ................... 117
Оптимизация асинхронного кода без длительной операции .... 118
Резюме ................................................................................. 119


ПРЕДИСЛОВИЕ
Средства асинхронного программирования – мощный механизм, добав- ленный в версию 5.0 языка программирования C#. Это произошло как раз в тот момент, когда производительность и распараллеливание вы- зывают всё более пристальный интерес у разработчиков программного обеспечения. При правильном использовании новые средства позволя- ют создавать программы с такими характеристиками производитель- ности и параллелизма, которых раньше можно было добиться только за счет написания объемного и громоздкого кода. Однако тема эта непрос- та, и у нее есть масса нюансов, не очевидных с первого взгляда.
Если не считать Visual Basic .NET, в который средства асинхрон- ного программирования были добавлены одновременно с C#, то ни в одном из других широко распространенных языков программиро- вания ничего эквивалентного нет
1
. Рекомендации по их применению в реальных программах найти трудно, опыт еще не наработан. В этой книге я хочу поделиться своей практикой работы, а также идеями, по- черпнутыми у проектировщиков C# и из теоретической информати- ки. Но главное – я покажу, что такое механизм async, как он работает и почему его стоит использовать.
Предполагаемая аудитория
Эта книга рассчитана на программистов, уверенно владеющих язы- ком C#. Быть может, вы хотите понять, что такое механизм async и стоит ли его использовать в своих программах. А, быть может, уже вовсю работаете с ним, но хотели бы познакомиться с передовыми приемами и узнать о подводных камнях.
Тем не менее, знакомство с другими продвинутыми средствами C# не предполагается, так что книга может быть полезна также начинаю- щим программистам на C# и тем, кто пишет на других языках.
На C# разрабатываются самые разные приложения, и во всех них механизм async может найти применения – для различных целей.
Поэтому в этой книге мы будем рассматривать как клиентские, так
1 Это чрезмерно категоричное утверждение оставим на совести автора. – Прим. перев.

10
Предисловие
и серверные программы и посвятим отдельные главы технологиям
ASP.NET и WinRT.
Как читать эту книгу
Предполагается, что вы будете читать книгу последовательно, от на- чала до конца – для того чтобы познакомиться с механизмом async.
Новые идеи излагаются по порядку и иллюстрируются на примерах.
В особенности это относится к первым пяти главам.
Лучший способ чему-то научиться – практиковаться, поэтому я ре- комендую выполнять все примеры. Для этого вам понадобится какая- нибудь среда разработки на C#, например Microsoft Visual Studio или
MonoDevelop. Не упускайте возможность развить примеры и приме- нить полученные знания в собственных программах – так вы сможете глубже усвоить материал.
Прочитав всю книгу, вы, возможно, захотите использовать главы, начиная с шестой, как справочник по продвинутым способам работы с async. Эти главы относительно независимы.
• В главах 6 и 7 рассматриваются приемы, применяемые при программировании с помощью async.
• Главы 8 и 9 посвящены нетривиальным аспектам механизма async.
• В главах с 10 по 13 обсуждаются ситуации, в которых меха- низм async может быть полезен.
• В главах 14 и 15 речь идет о внутреннем устройстве async.
Принятые соглашения
В этой книге используются следующие графические выделения:
Курсив
Таким шрифтом набраны новые термины, URL-адреса, адреса электронной почты, имена и расширения файлов.
Моноширинный шрифт
Применяется для набора листингов, а также внутри основного текста для обозначения элементов программы: имен перемен- ных и функций, баз данных, типов данных, переменных окру- жения, языковых конструкций и ключевых слов.
Моноширинный курсив
Так набран текст, вместо которого нужно подставить задавае- мые пользователем или зависящие от контекста значения.


11
Предисловие
Таким значком обозначаются советы, предложения и замечания общего характера.
О примерах кода
Эта книга призвана помогать вам в работе. Поэтому вы можете ис- пользовать приведенный в ней код в собственных программах и в документации. Спрашивать у нас разрешение необязательно, если только вы не собираетесь воспроизводить значительную часть кода.
Например, никто не возбраняет включить в свою программу несколь- ко фрагментов кода из книги. Однако для продажи или распростране- ния примеров на компакт-диске разрешение требуется. Цитировать книгу и примеры в ответах на вопросы можно без ограничений. Но для включения значительных объемов кода в документацию по собс- твенному продукту нужно получить разрешение.
Мы высоко ценим, хотя и не требуем, ссылки на наши издания.
В ссылке обычно указываются название книги, имя автора, изда- тельство и ISBN, например: «Async in C# 5.0 by Alex Davies O’Reilly).
Copyright 2012 Alex Davies, 978-1-449-33716-2».
Если вы полагаете, что планируемое использование кода выходит за рамки изложенной выше лицензии, пожалуйста, обратитесь к нам по адресу permissions@oreilly.com.
Как с нами связаться
Вопросы и замечания по поводу этой книги отправляйте в издательст- во:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472 800-998-9938 (в США и Канаде)
707-829-0515 (международный или местный)
707-829-0104 (факс)
Для этой книги имеется веб-страница, на которой публикуются списки замеченных ошибок, примеры и прочая дополнительная ин- формация. Адрес страницы: http://oreil.ly/Async_in_CSharp5.
Замечания и вопросы технического характера следует отправлять по адресу bookquestions@oreilly.com.

12
Предисловие
Дополнительную информацию о наших книгах, конференциях и новостях вы можете найти на нашем сайте по адресу http://www.
oreilly.com.
Читайте нас на Facebook: http://facebook.com/oreilly.
Следите за нашей лентой в Twitter: http://twitter.com/oreillymedia.
Смотрите нас на YouTube: http://www.youtube.com/oreillymedia.
Благодарности
Я благодарен Стивену Тоубу (Stephen Toub) не только за техничес- кое редактирование, но и за ценные сведения о некоторых аспектах параллельных вычислений. Именно из его блога я впервые узнал о многих идеях, которые объясняю на страницах этой книги. Спасибо
Хэмишу за корректуру и Кэти за то, что она подавала мне чай во вре- мя работы.
Я также благодарен Рэчел Румелиотис (Rachel Roumeliotis), моему редактору, и всему коллективу издательства O’Reilly, оказывавшему мне неоценимую помощь в работе над книгой.
Я признателен своей семье, особенно маме, которая ухаживала за мной после операции, когда и была написана большая часть текста.
И наконец, благодарю своих коллег по компании Red Gate, которые создали благоприятствующую экспериментам атмосферу, в которой у меня и зародилось желание исследовать механизм async на прак- тике.
Об авторе
Алекс Дэвис – программист, блогер и энтузиаст параллельного прог- раммирования. Проживает в Англии. В настоящее время является разработчиком и владельцем продукта в компании Red Gate, занима- ющейся созданием инструментария для платформы .NET. Получил ученую степень по информатике в Кэмбриджском университете и до сих пор теоретическая информатика у него в крови. В свободное время разрабатывает каркас Actors с открытым исходным кодом для .NET, цель которого – упростить написание параллельных программ.