Post on 23-Feb-2016
description
DEV308
C# 5.0 : async
Иван Бодягин ABBYY
Содержание
Обзор C# 5Подробно об async
Описание проблемыПреимущества asyncДетали реализацииОбласть применения и альтернативные подходы
C# 5
C# 5.0 == asyncРазработчики устали от частого внесения нового функционалаИзменения в компиляторе требуют поддержки студии, которая тоже активно меняетсяНовая версия компилятора реализуется на C#
Roslyn
CompilerPipeline
ParserSymbols
Binder IL EmitterMetadata
CompilerAPI
Syntax Tree API
Symbol API
Binding and Flow Analysis
APIEmit 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,TaskTask<T>
GetAwaiter() => awaiter.BeginAwait(), awaiter.EndAwait()
async, await и Task
awaitAwaiter GetAwaiter()
Awaiterbool BeginAwait()T EndAwait()
Task – асинхронность вовсе не означает параллелизм, но параллелизм означает асинхронность
Преобразования компилятора
Контекст синхронизации
await возвращает управление в «текущий контекст синхронизации»
SynchronizationContext.CurrentTaskSheduler.Current
Если SynchronizationContext определен, (ASP.Net, WPF, WinForms, SL…), то он используется и есть гарантия корректной работы с UIЕсли не определен, то берется поток из ThreadPool-а
Производительность
Сгенерированный код для поддержки асинхронности имеет свою стоимость
В некоторых сценариях эффективнее не использовать async, обладая знаниями о предметной области
Синхронное выполнение эффективнееРеализация MemoryStream
Task – можно переиспользоватьЧтение при копировании
Итогиasync позволяет создавать асинхронный, но не обязательно многопоточный код, который легко читать и поддерживать
Автоматический маршалинг в нужный контекст синхронизации
Работа с пользовательским интерфейсомWinForms, WPF, SilverLight
Экономия потоковСерверные приложения – асинхронная обработка запросов к БД, внешним ресурсам, ожидание ввода/выводаASP.NET
concurrency
Parallel Programming Latency
asyncRx
framework
TPL PLINQ
- Императивный подход
- Функциональный подход
Обратная связь
Уважаемые участники!Ваше мнение очень важно для нас!В блокноте, который находится в инфопаке участника, вы найдете анкету для оценки докладовПожалуйста, оцените доклад и сдайте анкету при выходе из зала модераторуДля участия в конкурсе заполненных анкет, отметьте в анкете номер, который указан на вашем бейдже
Спасибо!
Вопросы
DEV308 Иван Бодягин
ABBYYIvan_B@abbyy.com
Вы сможете задать вопросы докладчикам в зоне «Спроси эксперта» в течение часа после завершения этой сессии