230 likes | 460 Views
DEV308. ABBYY. C# 5.0 : async. Иван Бодягин. Содержание. Обзор C# 5 Подробно об async Описание проблемы Преимущества async Детали реализации Область применения и альтернативные подходы. C# 5. C# 5.0 == async Разработчики устали от частого внесения нового функционала
E N D
DEV308 ABBYY C# 5.0 : async Иван Бодягин
Содержание • Обзор C# 5 • Подробно об async • Описание проблемы • Преимущества async • Детали реализации • Область применения и альтернативные подходы
C# 5 • C# 5.0 == async • Разработчики устали от частого внесения нового функционала • Изменения в компиляторе требуют поддержки студии, которая тоже активно меняется • Новая версия компилятора реализуется на C#
Roslyn Parser Symbols Binder IL Emitter Compiler Pipeline Metadata Syntax Tree API Symbol API Binding and Flow Analysis API Emit API Compiler API
Зачем нужна асинхронность и параллелизм • Сложность приложений по прежнему растет • Закон Мура перестал приносить «Дивиденды Мура» • UI должен быть отзывчивым • Масштабируемость серверных решений • Новый API – WinRT, во многом асинхронный
Эволюция подхода • Раскладывать код по потокам – рутинная работа, реализация трудночитаема • Task Parallel Library: концепция Task, Continuation Passing Style • async • Позволяет реализовать логику так же как и в синхронном коде. • Позволяет экономить потоки
Область приминения async concurrency Parallel Programming Latency async
Синтаксис • async- ключевое слово перед методом содержащим асинхронные операции • Этот метод содержит асинхронные операции и будет изменен компилятором таким образом, чтобы после асинхронного вызова метод мог быть продолжен с нужного места. • await– ключевое слово перед асинхронной операцией • Остаток метода сделать «продолжением» (continuation) и вернуть управление вызывающему потоку. «продолжение» будет вызвано тогда, когда ожидаемый вызов завершится.
Работа async / await Демонстрация
Вызов асинхронного метода Вызов async метод Awaitable метод void, Task Task<T> GetAwaiter() => awaiter.BeginAwait(), awaiter.EndAwait()
async, awaitи Task • await • AwaiterGetAwaiter() • Awaiter • boolBeginAwait() • T EndAwait() • Task – асинхронность вовсе не означает параллелизм, но параллелизм означает асинхронность
Контекст синхронизации • await возвращает управление в «текущий контекст синхронизации» • SynchronizationContext.Current • TaskSheduler.Current • Если SynchronizationContextопределен, (ASP.Net, WPF, WinForms, SL…), то он используется и есть гарантия корректной работы с UI • Если не определен, то берется поток из ThreadPool-а
Производительность • Сгенерированный код для поддержки асинхронности имеет свою стоимость • В некоторых сценариях эффективнее не использовать async, обладая знаниями о предметной области
Синхронное выполнение эффективнее • Реализация MemoryStream • Task – можно переиспользовать • Чтение при копировании
Итоги • asyncпозволяет создавать асинхронный, но не обязательно многопоточный код, который легко читать и поддерживать • Автоматический маршалинг в нужный контекст синхронизации • Работа с пользовательским интерфейсом • WinForms, WPF, SilverLight • Экономия потоков • Серверные приложения – асинхронная обработка запросов к БД, внешним ресурсам, ожидание ввода/вывода • ASP.NET
concurrency Parallel Programming Latency TPL PLINQ async Rx framework • Императивный подход • Функциональный подход
Обратная связь Уважаемые участники! Ваше мнение очень важно для нас! В блокноте, который находится в инфопаке участника, вы найдете анкету для оценки докладов Пожалуйста, оцените доклад и сдайте анкету при выходе из зала модератору Для участия в конкурсе заполненных анкет, отметьте в анкете номер, который указан на вашем бейдже Спасибо!
Вопросы • DEV308 • Иван Бодягин • ABBYY • Ivan_B@abbyy.com • Вы сможете задать вопросы докладчикам в зоне «Спроси эксперта» в течение часа после завершения этой сессии