SlideShare a Scribd company logo
1 of 10
Асинхронные вызовы в .NET
Общеупотребительные паттерны
Синхронный вызов
• var result = service.DoSomething(source);
Код
• Максимально простой и понятный способ сделать что-либо
Плюсы
• Поток занят все время до получения результата
• Занятость GUI-потока – второй смертный грех перед пользователем
• Для веб-платформ еще хуже: висит интерфейс браузера
• Для мобильных платформ совсем плохо: процесс после нескольких
секунд будет принудительно выгружен
Минусы
Event Based AsyncPattern
• Метод DoSomething -> void DoSomethingAsync
• Добавлено событие DoSomethingCompleted
• Опциональный метод DoSomethingAsyncCancel
• Опциональное событие DoSomethingProgress
Модификации
• service.DoSomethingCompleted += SomethingCompleted;
service.DoSomethingAsync(source);
private void SomethingCompleted(object sender,
DoSomethingCompletedEventArgs args)
{
_result = args.result;
service.OnCompleted -= SomethingCompleted;
}
Код
EAP как антипаттерн
• Результат не удастся локализовать в вызывающем методе
• Необходимость отписки от события не даст использовать лямбдуГлобальность
• Нет никаких гарантий, что по событию не придет чужой ответ
• Нет, никаких гарантий, что по событию другому не придет ваш ответ
• Разрешение этих ситуаций требует специальных мер по передаче и
распознаванию состояния в событии
Временная
зависимость
• Объем кода на порядок выше, чем простой синхронный вызов
• Вызов раскидан по коду класса в трех местах – минимум два метода и
поле
Неудобочитаемость
Asynchronous Programming Model
•Метод resultType DoSomething(source) -> IAsyncResult BeginDoSomething(source,
AsyncCallback completed)
•Добавляется метод TResult EndDoSomething(asyncResult)
•Опционально добавляется метод (лямбда) c параметром IAsyncResult
Модификации
•Метод BeginDoSomething возвращает управление немедленно
•Метод EndDoSomething ждет окончания асинхронной операции и возвращает ее результат
(включая возможный выброс исключения)
•Метод обратного вызова получает управление после завершения задачи в другом потоке
•IAsyncResult позволяет получить переданное произвольное состояние, узнать, завершилась
ли операция, дождаться завершения по событию
Поведение
•BeginDoSomething(source, asyncResult => {var result = EndSomething(AsyncResult);
HandleResult(result)})Код
Плюсы и минусы APM
• Универсальность – паттерн покрывает практически любые асинхронные
вызовы без специальных ухищрений
• Многие библиотеки используют именно этот паттерн
• WCF генерирует асинхронные вызовы по этому паттерну
• Многие библиотеки требуют от пользователя использовать этот паттерн
Плюсы
• По сравнению с более современными решениями синтаксис громоздкий
• Синхронизация кода в методе обратного вызова – наша проблема
• Поддержка прерывания выполнения длительной операции – тоже наша
проблема
• Логически связанный код «до» и «после» делится на два разных блока –
затруднено использование using и т.п.
• Этот паттерн официально объявлен устаревшим
Минусы
Task-based Asynchronous Pattern
• TResult DoSomething(source) -> Task<TResult> DoSomething(source)
• Дополнительно в асинхронный метод можно передать токен отмены
• Если операция позволяет следить за прогрессом – добавляется параметр
IProgress<T>
Модификации
• Стандартный способ отмены выполнения
• Совместимость с APM, стандартные методы конвертации туда и обратно
• Стандартная асинхронная реализация контроля прогресса
• Этот метод рекомендован официально
• TaskCompletionSource позволяет превратить в задачу что угодно
Плюсы
• Асинхронная обработка результата все-таки в методе обратного вызова со
всеми вытекающимиМинусы
Async Enumerator
•Это клиентский паттерн, работающий поверх APM
•Вместо указания метода обратного вызова используется оператор yield return
•Код после yield return выполняется в тот же момент, что и обратный вызов завершения
операции
•Возвращаемое число соответствует числу ожидаемых асинхронных результатов
•Для возврата результата используется метод AsyncEnumerator.DequeueAsyncResult()
Модификации
•IEnumerable<int> AsyncDoSomething(AsyncEmumerator asyncEnumerator)
{ service.BeginDoSomething(source, asyncEnumerator.End());
yield return 1;
var result = service.DoEndSomething(asyncEnumerator.DequeueAsyncResult()); }
• AsyncEnumerator asyncEnumerator = new AsyncEnumerator();
asyncEnumerator.Execute(AsyncDoSomething(asyncEnumerator));
Код
•Код с методами обратного вызова превращается в линейный
•Не нужно никаких специальных мер для выполнения обработки результатов в том же
контексте потока
•Для прерывания ожидания результатов достаточно вызвать yield break
•Сам вызов итератора соответсвует паттерну APM
•Отсутствует дополнительное потребление ресурсов
Плюсы
Async/Await
•Async/Await – синтаксический сахар .NET 4.5, решающий ту же задачу, что и AsyncEnumerable
•Любой метод, который возвращает Task<TResult> можно вызвать result = await
DoSomethingAsync(source)
•Все, что после await, будет выполнено после завершения задачи
•Метод с await внутри должен быть помечен async и возвращать задачу или void
•В его коде создавать задачу не надо - .NET сделает это за вас
Модификация
•Все плюшки AsyncEnumerator в сочетании с прозрачным кодом
•Нет ограничений на try..catch
•Вся мощь TPL и здесь к нашим услугам
•Минимальное время отклика и потребление ресурсов без лишнего шумового кода
•await не требует именно задачу – достаточно реализации метода GetAwaiter
•Можно получить await/async на .NET 4.0
Плюсы
•Если не нужно выполнение продолжения в контексте вызова – надо много
ConfigureAwait(false)
•Если нельзя заставлять ждать вызывающий поток – вся цепочка вызовов должна быть async
•await не пробрасывает AggregateException
•.NET 4.0 надо патчить
Минусы
Теперь асинхронное
программирование просто?
Обработка
исключений
Гонки Контекст
Производительность Дырявые
абстракции

More Related Content

What's hot

Тестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumТестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumSQALab
 
Григорий Липин: Автоматизация нагрузочного тестирования
Григорий Липин: Автоматизация нагрузочного тестированияГригорий Липин: Автоматизация нагрузочного тестирования
Григорий Липин: Автоматизация нагрузочного тестированияYandex
 
Wild Async .NET world: AID Kit for boy-scouts
Wild Async .NET world: AID Kit for boy-scoutsWild Async .NET world: AID Kit for boy-scouts
Wild Async .NET world: AID Kit for boy-scoutsHYS Enterprise
 
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton TsitouFwdays
 
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf Conference
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Немного о кеше
Немного о кешеНемного о кеше
Немного о кешеDmitry Ignatiev
 
Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey FyodorovNonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey FyodorovJavaDayUA
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 
Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Vasil Remeniuk
 
Макс Лапшин - "EventMachine и evented архитектура"
Макс Лапшин - "EventMachine и evented архитектура"Макс Лапшин - "EventMachine и evented архитектура"
Макс Лапшин - "EventMachine и evented архитектура"railsclub
 
SOA: Строим свой service mesh
SOA: Строим свой service meshSOA: Строим свой service mesh
SOA: Строим свой service meshIvan Kruglov
 
Автоматизация нагрузочного тестирования — Григорий Липин
Автоматизация нагрузочного тестирования — Григорий ЛипинАвтоматизация нагрузочного тестирования — Григорий Липин
Автоматизация нагрузочного тестирования — Григорий ЛипинYandex
 
Java black box profiling
Java black box profilingJava black box profiling
Java black box profilingaragozin
 
Нагрузочное тестирование с помощью Яндекс.Танка
Нагрузочное тестирование с помощью Яндекс.ТанкаНагрузочное тестирование с помощью Яндекс.Танка
Нагрузочное тестирование с помощью Яндекс.ТанкаAleksandr Boichenko
 
JMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладJMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладSQALab
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 

What's hot (20)

Тестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumТестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и Selenium
 
Эффективное %s с ZMQ
Эффективное %s с ZMQЭффективное %s с ZMQ
Эффективное %s с ZMQ
 
Григорий Липин: Автоматизация нагрузочного тестирования
Григорий Липин: Автоматизация нагрузочного тестированияГригорий Липин: Автоматизация нагрузочного тестирования
Григорий Липин: Автоматизация нагрузочного тестирования
 
Wild Async .NET world: AID Kit for boy-scouts
Wild Async .NET world: AID Kit for boy-scoutsWild Async .NET world: AID Kit for boy-scouts
Wild Async .NET world: AID Kit for boy-scouts
 
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
 
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework Applications
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Немного о кеше
Немного о кешеНемного о кеше
Немного о кеше
 
Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey FyodorovNonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14
 
Макс Лапшин - "EventMachine и evented архитектура"
Макс Лапшин - "EventMachine и evented архитектура"Макс Лапшин - "EventMachine и evented архитектура"
Макс Лапшин - "EventMachine и evented архитектура"
 
SOA: Строим свой service mesh
SOA: Строим свой service meshSOA: Строим свой service mesh
SOA: Строим свой service mesh
 
Reactive UI на C#
Reactive UI на C#Reactive UI на C#
Reactive UI на C#
 
Lab5
Lab5Lab5
Lab5
 
Автоматизация нагрузочного тестирования — Григорий Липин
Автоматизация нагрузочного тестирования — Григорий ЛипинАвтоматизация нагрузочного тестирования — Григорий Липин
Автоматизация нагрузочного тестирования — Григорий Липин
 
Java black box profiling
Java black box profilingJava black box profiling
Java black box profiling
 
Нагрузочное тестирование с помощью Яндекс.Танка
Нагрузочное тестирование с помощью Яндекс.ТанкаНагрузочное тестирование с помощью Яндекс.Танка
Нагрузочное тестирование с помощью Яндекс.Танка
 
JMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладJMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский доклад
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 

Similar to Асинхронные вызовы в .NET

Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
Высокоуровневый параллелизм
Высокоуровневый параллелизмВысокоуровневый параллелизм
Высокоуровневый параллелизмBonart
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS Pavel Tsukanov
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...Ontico
 
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько раз
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько разRootConf 2015: Как Vagrant и Chef ускорили разработку в несколько раз
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько разTimur Batyrshin
 
Высокоуровневая обработка событий
Высокоуровневая обработка событий Высокоуровневая обработка событий
Высокоуровневая обработка событий Bonart
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - MultithreadingNoveo
 
gRPC в продакшне для мобильных приложений
gRPC в продакшне для мобильных приложенийgRPC в продакшне для мобильных приложений
gRPC в продакшне для мобильных приложенийMad Devs
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
async/await: собираем грабли
async/await: собираем граблиasync/await: собираем грабли
async/await: собираем граблиAndrey Chasovskikh
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014InterSystems
 
Иван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеИван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеYandex
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutinescorehard_by
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Ontico
 

Similar to Асинхронные вызовы в .NET (20)

Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 
Async Python
Async PythonAsync Python
Async Python
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Высокоуровневый параллелизм
Высокоуровневый параллелизмВысокоуровневый параллелизм
Высокоуровневый параллелизм
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...
 
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько раз
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько разRootConf 2015: Как Vagrant и Chef ускорили разработку в несколько раз
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько раз
 
Высокоуровневая обработка событий
Высокоуровневая обработка событий Высокоуровневая обработка событий
Высокоуровневая обработка событий
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - Multithreading
 
gRPC в продакшне для мобильных приложений
gRPC в продакшне для мобильных приложенийgRPC в продакшне для мобильных приложений
gRPC в продакшне для мобильных приложений
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
UA Mobile 2012
UA Mobile 2012UA Mobile 2012
UA Mobile 2012
 
async/await: собираем грабли
async/await: собираем граблиasync/await: собираем грабли
async/await: собираем грабли
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
 
Иван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеИван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программирование
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
 

Асинхронные вызовы в .NET

  • 1. Асинхронные вызовы в .NET Общеупотребительные паттерны
  • 2. Синхронный вызов • var result = service.DoSomething(source); Код • Максимально простой и понятный способ сделать что-либо Плюсы • Поток занят все время до получения результата • Занятость GUI-потока – второй смертный грех перед пользователем • Для веб-платформ еще хуже: висит интерфейс браузера • Для мобильных платформ совсем плохо: процесс после нескольких секунд будет принудительно выгружен Минусы
  • 3. Event Based AsyncPattern • Метод DoSomething -> void DoSomethingAsync • Добавлено событие DoSomethingCompleted • Опциональный метод DoSomethingAsyncCancel • Опциональное событие DoSomethingProgress Модификации • service.DoSomethingCompleted += SomethingCompleted; service.DoSomethingAsync(source); private void SomethingCompleted(object sender, DoSomethingCompletedEventArgs args) { _result = args.result; service.OnCompleted -= SomethingCompleted; } Код
  • 4. EAP как антипаттерн • Результат не удастся локализовать в вызывающем методе • Необходимость отписки от события не даст использовать лямбдуГлобальность • Нет никаких гарантий, что по событию не придет чужой ответ • Нет, никаких гарантий, что по событию другому не придет ваш ответ • Разрешение этих ситуаций требует специальных мер по передаче и распознаванию состояния в событии Временная зависимость • Объем кода на порядок выше, чем простой синхронный вызов • Вызов раскидан по коду класса в трех местах – минимум два метода и поле Неудобочитаемость
  • 5. Asynchronous Programming Model •Метод resultType DoSomething(source) -> IAsyncResult BeginDoSomething(source, AsyncCallback completed) •Добавляется метод TResult EndDoSomething(asyncResult) •Опционально добавляется метод (лямбда) c параметром IAsyncResult Модификации •Метод BeginDoSomething возвращает управление немедленно •Метод EndDoSomething ждет окончания асинхронной операции и возвращает ее результат (включая возможный выброс исключения) •Метод обратного вызова получает управление после завершения задачи в другом потоке •IAsyncResult позволяет получить переданное произвольное состояние, узнать, завершилась ли операция, дождаться завершения по событию Поведение •BeginDoSomething(source, asyncResult => {var result = EndSomething(AsyncResult); HandleResult(result)})Код
  • 6. Плюсы и минусы APM • Универсальность – паттерн покрывает практически любые асинхронные вызовы без специальных ухищрений • Многие библиотеки используют именно этот паттерн • WCF генерирует асинхронные вызовы по этому паттерну • Многие библиотеки требуют от пользователя использовать этот паттерн Плюсы • По сравнению с более современными решениями синтаксис громоздкий • Синхронизация кода в методе обратного вызова – наша проблема • Поддержка прерывания выполнения длительной операции – тоже наша проблема • Логически связанный код «до» и «после» делится на два разных блока – затруднено использование using и т.п. • Этот паттерн официально объявлен устаревшим Минусы
  • 7. Task-based Asynchronous Pattern • TResult DoSomething(source) -> Task<TResult> DoSomething(source) • Дополнительно в асинхронный метод можно передать токен отмены • Если операция позволяет следить за прогрессом – добавляется параметр IProgress<T> Модификации • Стандартный способ отмены выполнения • Совместимость с APM, стандартные методы конвертации туда и обратно • Стандартная асинхронная реализация контроля прогресса • Этот метод рекомендован официально • TaskCompletionSource позволяет превратить в задачу что угодно Плюсы • Асинхронная обработка результата все-таки в методе обратного вызова со всеми вытекающимиМинусы
  • 8. Async Enumerator •Это клиентский паттерн, работающий поверх APM •Вместо указания метода обратного вызова используется оператор yield return •Код после yield return выполняется в тот же момент, что и обратный вызов завершения операции •Возвращаемое число соответствует числу ожидаемых асинхронных результатов •Для возврата результата используется метод AsyncEnumerator.DequeueAsyncResult() Модификации •IEnumerable<int> AsyncDoSomething(AsyncEmumerator asyncEnumerator) { service.BeginDoSomething(source, asyncEnumerator.End()); yield return 1; var result = service.DoEndSomething(asyncEnumerator.DequeueAsyncResult()); } • AsyncEnumerator asyncEnumerator = new AsyncEnumerator(); asyncEnumerator.Execute(AsyncDoSomething(asyncEnumerator)); Код •Код с методами обратного вызова превращается в линейный •Не нужно никаких специальных мер для выполнения обработки результатов в том же контексте потока •Для прерывания ожидания результатов достаточно вызвать yield break •Сам вызов итератора соответсвует паттерну APM •Отсутствует дополнительное потребление ресурсов Плюсы
  • 9. Async/Await •Async/Await – синтаксический сахар .NET 4.5, решающий ту же задачу, что и AsyncEnumerable •Любой метод, который возвращает Task<TResult> можно вызвать result = await DoSomethingAsync(source) •Все, что после await, будет выполнено после завершения задачи •Метод с await внутри должен быть помечен async и возвращать задачу или void •В его коде создавать задачу не надо - .NET сделает это за вас Модификация •Все плюшки AsyncEnumerator в сочетании с прозрачным кодом •Нет ограничений на try..catch •Вся мощь TPL и здесь к нашим услугам •Минимальное время отклика и потребление ресурсов без лишнего шумового кода •await не требует именно задачу – достаточно реализации метода GetAwaiter •Можно получить await/async на .NET 4.0 Плюсы •Если не нужно выполнение продолжения в контексте вызова – надо много ConfigureAwait(false) •Если нельзя заставлять ждать вызывающий поток – вся цепочка вызовов должна быть async •await не пробрасывает AggregateException •.NET 4.0 надо патчить Минусы
  • 10. Теперь асинхронное программирование просто? Обработка исключений Гонки Контекст Производительность Дырявые абстракции