SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Асинхронное
программирование
Сергей Тепляков, Visual C# MVP
.NET Architect at Luxoft
SergeyTeplyakov.blogspot.com
Sync vs Async
Synchronous
Perform something here and now.
I’ll regain control to execute something else
when it’s done.
Asynchronous
Эволюция языка C#
Sync vs Async
Caller Srv
Foo
42
Caller Srv
Operation finished
Result: 42
FooAsync
Operation Started
Bckgn
Starting background
operation
Notifies
t
t
t0
Sync vs Async
Sync vs Async
var webRequest = WebRequest.Create(Url);
using (var response = webRequest.GetResponse())
{
using (var file = new FileStream(FileName,
FileMode.OpenOrCreate))
{
var length = response.ContentLength;
var textWriter = new StreamWriter(file);
textWriter.Write(length.ToString());
textWriter.Close();
}
}
Sync vs Async (2)
var webRequest = WebRequest.Create(Url);
using (var response = await webRequest.GetResponseAsync())
{
using (var file = new FileStream(FileName,
FileMode.OpenOrCreate))
{
var length = response.ContentLength;
var textWriter = new StreamWriter(file);
await textWriter.WriteAsync(length.ToString());
textWriter.Close();
}
}
Копайте в глубь!
Все нетривиальные абстракции дырявы
Джоэл Спольски «Закон дырявых абстракций»
Вы должны понимать как минимум на один
уровень абстракции ниже того уровня, на
котором вы кодируете
Ли Кэмпбел (Lee Campbell)
Async/await – лишь вершина
Async/Await Sample
public async Task AsyncMethod(string url, string fileName)
{
var webRequest = WebRequest.Create(url);
Task<WebResponse> tResp = webRequest.GetResponseAsync();
WebResponse response = await tResp;
var responseStream = response.GetResponseStream();
var tr = new StreamReader(responseStream);
Task<string> tContent = tr.ReadToEndAsync();
string content = await tContent;
var file = File.OpenWrite(fileName);
var streamWriter = new StreamWriter(file);
Task writeResult = streamWriter.WriteAsync(content);
await writeResult;
Console.WriteLine("AsyncMethod finished");
}
Async/Await Sample
Код Поток
var webRequest = WebRequest.Create(url);
Task<WebResponse> tResp = webRequest.GetResponseAsync();
Вызывающий поток
Await возвращает управление вызывающему коду
WebResponse response = await tResp;
var responseStream = response.GetResponseStream();
var tr = new StreamReader(responseStream);
Task<string> tContent = tr.ReadToEndAsync();
Поток 2
Await возвращает управление вызывающему коду
string content = await tContent;
var file = File.OpenWrite(fileName);
var streamWriter = new StreamWriter(file);
Task writeResult = streamWriter.WriteAsync(content);
Поток 3
Await возвращает управление вызывающему коду
await writeResult;
Console.WriteLine("AsyncMethod finished");
Поток 4
Метод завершен успешно
Async vs. Tasks
public async Task SimpleAsync(string url)
{
var webRequest = WebRequest.Create(url);
Task<WebResponse> tResp = webRequest.GetResponseAsync();
WebResponse response = await tResp;
Console.WriteLine("Got the response");
}
public Task AsyncMethodImpl(string url)
{
var webRequest = WebRequest.Create(url);
Task<WebResponse> tResp = webRequest.GetResponseAsync();
return tResp.ContinueWith(t =>
{
Console.WriteLine("Got the response");
}, TaskScheduler.FromCurrentSynchronizationContext());
}
Synchronization Context
• Некоторые типы приложений налагают ограничения на
«потоковую» модель
• Control.Invoke/BeginInvoke
• Dispatcher.Invoke/BeginInvoke
• Контекст синхронизации «прячет» эти детали за
абстрактным интерфейсом
• Контекст нужен для «маршалинга» управления из одного
потока в другой (*)
• Контексты повсюду!
Зачем мне это?
Я же программирую на C# 5.0!
Что будет в этом случае?
private async Task<int> Foo()
{
buttonRun.Enabled = false;
await LongRunningTask();
buttonRun.Enabled = true;
return 42;
}
private void btn_Click(object sender, EventArgs e)
{
label.Text = FooAsync().Result.ToString();
}
«Продолжение» должно
вызываться в UI потоке
Ожидает завершения
асинхронной операции
Захватываем Sync Context
Возвращает
управление!
“Sync over Async” + UI ==
Deadlock!
Решение
private async Task<int> Foo()
{
buttonRun.Enabled = false;
await LongRunningTask();
buttonRun.Enabled = true;
return 42;
}
private async void buttonRun_Click(object sender, EventArgs e)
{
textBoxStatus.Text = "";
textBoxStatus.Text = (await Foo()).ToString();
}
Паттерны асинхронного
программирования
• Asynchronous Programming Model (APM)
• BeginInvoke/EndInvoke
• Event-Based Async Pattern (EAP)
• BackgroundWorker: RunWorkerAsync, RunWorkerCompleted
• Bicycle –Async Pattern (BAP)
• Кастомные решения
• Task-Based Async Pattern (TAP)
• Task<int> ReadAsync
Exception Handling
Task.Result
Task.Wait
await task; FirstException
AggregateExceptionfails
fails
Demo. Exception Handling
Где вылетит ошибка?
var ms = new MemoryStream();
// Здесь?
Task<int> task = ms.ReadAsync(null, 0, 42);
// Или здесь?
int result = task.Result;
• Является исключение «синхронным» или «асинхронным»?
«Наивная» реализация
public static async Task<int> ReadAsync(byte[] buffer)
{
if (buffer == null)
throw new ArgumentNullException("buffer");
// Реализация асинхронного чтения
return 42;
}
Результирующая задача перейдет в
Faulted состояние!
• Синхронное исключение означает «баг» в
вызывающем коде.
• «Поломанная» задача означает баг в реализации!
Зачем заморачиваться?
Корректная реализация
public static Task<int> ReadAsync(byte[] buffer)
{
if (buffer == null)
throw new ArgumentNullException("buffer");
return ReadAsyncImpl(buffer);
}
private static async Task<int> ReadAsyncImpl(byte[] buffer)
{
// Реализация асинхронногочтения
return 42;
}
Синхронная проверка
«предусловий»
Demo. Exception Handling
Обработка нескольких
исключений
public static async Task FooAsync()
{
// t1 "падает"
Task<int> t1 = Task<int>.Factory.StartNew(() =>
{
throw new Exception("E1");
});
// t2 тоже "падает"
Task<int> t2 = Task<int>.Factory.StartNew(() =>
{
throw new Exception("E2");
});
int r1 = await t1;
int r2 = await t2;
}
Получим “E1”?
Получим “E2”?
Получим
AggregateException?
UnobservedTaskException!
Unobserved Exceptions
• Событие TaskScheduler.UnobservedException
• Генерируется финализатором
• Не вызывается при обращении к
• Result
• Exception
• Вызове Wait
• Поведение зависит от версии .NET Framework
• .NET 4.5 – «умалчивается» (*)
• .NET 4.0 – «ломает» приложение
Await исключений
public static async Task<int> SimpleAsync()
{
throw new CustomException();
}
public static async void ConsumeSimpleAsync()
{
var task = SimpleAsync();
try
{
// "Разыменовывание" задачи приводит к
// "разворачиванию" первого исключения!
int result = await task;
}
catch (CustomException)
{
Console.WriteLine("Yahoo!!!");
}
}
“Решение”
public static async Task FooAsync()
{
// t1 "падает"
Task<int> t1 = Task<int>.Factory.StartNew(() =>
{
throw new Exception("E1");
});
// t2 тоже "падает"
Task<int> t2 = Task<int>.Factory.StartNew(() =>
{
throw new Exception("E2");
});
// "Наблюдаем" оба исключения
var task = Task.WhenAll(t1, t2);
await task.ContinueWith(_ => _.Result);
int r1 = t1.Result;
int r2 = t2.Result;
}
«Объединяем» обе задачи
await task; пробросил бы лишь первое
исключение!Явно генерируем AggregateException!!!!
И как это дело ловить?
var task = Modified.FooAsync();
try
{
await task;
}
// Для случая более одного исключения
catch (AggregateException e)
{
// "Выпрямляем" все исключения
int count = e.Flatten().InnerExceptions.Count;
Console.WriteLine(
"Demo2.Modified.FooAsync failed with {0} exceptions",
count);
}
// Для более простых случаев
catch (CustomException e) { }
catch (Exception e) {}
Асинхронные методы
• Типы возвращаемого значения асинхронного метода:
• async void FooAasync() – Fire and Forget (*)
• async Task FooAsync() – (void Foo())
• async Task<T> FooAsync() – (T Foo())
Demo. Async Void
Async Guidelines
• Async void – это операции вида “fire-and-forget”
• Вызывающий код не может узнать о завершении
асинхронного метода
• Вызывающий код не может обработать исключения
(вместо этого они попадут в цикл обработки UI
сообщений)
• Используйте async void только для обработчиков событий
самого высокого уровня.
• Используйте возвращаемые значения!
• Осторожнее с асинхронными лямбда-выражениями!
Сколько же тут всего…
• Влияние TAP на дизайн приложения!
• Обработка исключений
• Unobserved exceptions
• Bugs vs Task Faults
• Гранулярность асинхронных операций
• Testability
• Work stealing
• Async Programming Guidelines
• Avoid “async void”
• Avoid async lambdas
• Consider performance impact
• Avoid “Sync over Async”
• Avoid “Async over Sync”
• Consider using ConfigureAwait
Вот этого не надо
- Как вы пишите софт?
- Бац-бац и в продакшн (с).
- Как из синхронного приложения сделать
асинхронное?
- Async/await и готово!
Вопросы?
Спасибо за внимание
• Сергей Тепляков, Visual C# MVP
• .NET Architect at Luxoft
• Sergey.Teplyakov@gmail.com
• http://sergeyteplyakov.blogspot.com/
Что думает по этому поводу
Eric Lippert?
Q: C# 5.0 has new feature called async/await. Why should
developers be excited about it?
A: People like me, are excited about this feature because its
a cooperative multitasking with coroutines implementing using
continuation passing style.

Weitere ähnliche Inhalte

Was ist angesagt?

Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRAMBLER&Co
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
Haskell
HaskellHaskell
HaskellDevDay
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 

Was ist angesagt? (20)

Zagursky
ZagurskyZagursky
Zagursky
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Haskell
HaskellHaskell
Haskell
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 

Andere mochten auch

Тонкости асинхронного программирования
Тонкости асинхронного программированияТонкости асинхронного программирования
Тонкости асинхронного программированияSergey Teplyakov
 
Object-2-Object mapping, как приправа к вашему проекту
Object-2-Object mapping, как приправа к вашему проектуObject-2-Object mapping, как приправа к вашему проекту
Object-2-Object mapping, как приправа к вашему проектуAlex Tumanoff
 
Sql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton VidishchevSql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton VidishchevAlex Tumanoff
 
Bdd by Dmitri Aizenberg
Bdd by Dmitri AizenbergBdd by Dmitri Aizenberg
Bdd by Dmitri AizenbergAlex Tumanoff
 
Java. Lecture 05. Handling Exceptions and Debugging
Java. Lecture 05. Handling Exceptions and DebuggingJava. Lecture 05. Handling Exceptions and Debugging
Java. Lecture 05. Handling Exceptions and Debuggingcolriot
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Anton Moiseenko
 
Microsoft Office 2013 новая модель разработки приложений
Microsoft Office 2013 новая модель разработки приложенийMicrosoft Office 2013 новая модель разработки приложений
Microsoft Office 2013 новая модель разработки приложенийAlex Tumanoff
 
Java Core. Lecture#6. Part#1. Generics.
Java Core. Lecture#6. Part#1. Generics.Java Core. Lecture#6. Part#1. Generics.
Java Core. Lecture#6. Part#1. Generics.Anton Moiseenko
 
Patterns of parallel programming
Patterns of parallel programmingPatterns of parallel programming
Patterns of parallel programmingAlex Tumanoff
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Javametaform
 
Maven как средство сборки проекта
Maven как средство сборки проектаMaven как средство сборки проекта
Maven как средство сборки проектаYova Stoika
 
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с MavenКурс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven7bits
 

Andere mochten auch (16)

Тонкости асинхронного программирования
Тонкости асинхронного программированияТонкости асинхронного программирования
Тонкости асинхронного программирования
 
Object-2-Object mapping, как приправа к вашему проекту
Object-2-Object mapping, как приправа к вашему проектуObject-2-Object mapping, как приправа к вашему проекту
Object-2-Object mapping, как приправа к вашему проекту
 
Sql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton VidishchevSql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton Vidishchev
 
Bdd by Dmitri Aizenberg
Bdd by Dmitri AizenbergBdd by Dmitri Aizenberg
Bdd by Dmitri Aizenberg
 
Design principles
Design principles Design principles
Design principles
 
Java. Lecture 05. Handling Exceptions and Debugging
Java. Lecture 05. Handling Exceptions and DebuggingJava. Lecture 05. Handling Exceptions and Debugging
Java. Lecture 05. Handling Exceptions and Debugging
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 
Exceptions
ExceptionsExceptions
Exceptions
 
ABOUT PACKAGES
ABOUT PACKAGESABOUT PACKAGES
ABOUT PACKAGES
 
Microsoft Office 2013 новая модель разработки приложений
Microsoft Office 2013 новая модель разработки приложенийMicrosoft Office 2013 новая модель разработки приложений
Microsoft Office 2013 новая модель разработки приложений
 
Java Core. Lecture#6. Part#1. Generics.
Java Core. Lecture#6. Part#1. Generics.Java Core. Lecture#6. Part#1. Generics.
Java Core. Lecture#6. Part#1. Generics.
 
Patterns of parallel programming
Patterns of parallel programmingPatterns of parallel programming
Patterns of parallel programming
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
 
Maven как средство сборки проекта
Maven как средство сборки проектаMaven как средство сборки проекта
Maven как средство сборки проекта
 
Mono
MonoMono
Mono
 
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с MavenКурс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
 

Ähnlich wie Async clinic by by Sergey Teplyakov

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
 
async/await: собираем грабли
async/await: собираем граблиasync/await: собираем грабли
async/await: собираем граблиAndrey Chasovskikh
 
Асинхронные вызовы в .NET
Асинхронные вызовы в .NETАсинхронные вызовы в .NET
Асинхронные вызовы в .NETBonart
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitByndyusoft
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS Pavel Tsukanov
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Иван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеИван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеYandex
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в ОблакеGeeksLab Odessa
 
О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?Tatyanazaxarova
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 

Ähnlich wie Async clinic by by Sergey Teplyakov (20)

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
 
async/await: собираем грабли
async/await: собираем граблиasync/await: собираем грабли
async/await: собираем грабли
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Асинхронные вызовы в .NET
Асинхронные вызовы в .NETАсинхронные вызовы в .NET
Асинхронные вызовы в .NET
 
Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
Rx
RxRx
Rx
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/await
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Иван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеИван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программирование
 
PowerShell
PowerShellPowerShell
PowerShell
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в Облаке
 
О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Async Python
Async PythonAsync Python
Async Python
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 

Mehr von Alex Tumanoff

Sql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen NedaskivskyiSql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen NedaskivskyiAlex Tumanoff
 
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis ReznikOdessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis ReznikAlex Tumanoff
 
Azure data bricks by Eugene Polonichko
Azure data bricks by Eugene PolonichkoAzure data bricks by Eugene Polonichko
Azure data bricks by Eugene PolonichkoAlex Tumanoff
 
Sdlc by Anatoliy Anthony Cox
Sdlc by  Anatoliy Anthony CoxSdlc by  Anatoliy Anthony Cox
Sdlc by Anatoliy Anthony CoxAlex Tumanoff
 
Kostenko ux november-2014_1
Kostenko ux november-2014_1Kostenko ux november-2014_1
Kostenko ux november-2014_1Alex Tumanoff
 
Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3Alex Tumanoff
 
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас..."Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...Alex Tumanoff
 
Navigation map factory by Alexey Klimenko
Navigation map factory by Alexey KlimenkoNavigation map factory by Alexey Klimenko
Navigation map factory by Alexey KlimenkoAlex Tumanoff
 
Serialization and performance by Sergey Morenets
Serialization and performance by Sergey MorenetsSerialization and performance by Sergey Morenets
Serialization and performance by Sergey MorenetsAlex Tumanoff
 
Игры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей РыбаковИгры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей РыбаковAlex Tumanoff
 
Android sync adapter
Android sync adapterAndroid sync adapter
Android sync adapterAlex Tumanoff
 
Неформальные размышления о сертификации в IT
Неформальные размышления о сертификации в ITНеформальные размышления о сертификации в IT
Неформальные размышления о сертификации в ITAlex Tumanoff
 
Разработка расширений Firefox
Разработка расширений FirefoxРазработка расширений Firefox
Разработка расширений FirefoxAlex Tumanoff
 
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So..."AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...Alex Tumanoff
 
Lambda выражения и Java 8
Lambda выражения и Java 8Lambda выражения и Java 8
Lambda выражения и Java 8Alex Tumanoff
 
XP практики в проектах с тяжелой наследственностью
XP практики в проектах с тяжелой наследственностьюXP практики в проектах с тяжелой наследственностью
XP практики в проектах с тяжелой наследственностьюAlex Tumanoff
 
Первые шаги во фрилансе
Первые шаги во фрилансеПервые шаги во фрилансе
Первые шаги во фрилансеAlex Tumanoff
 
Spring Web Flow. A little flow of happiness.
Spring Web Flow. A little flow of happiness.Spring Web Flow. A little flow of happiness.
Spring Web Flow. A little flow of happiness.Alex Tumanoff
 

Mehr von Alex Tumanoff (20)

Sql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen NedaskivskyiSql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen Nedaskivskyi
 
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis ReznikOdessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
 
Azure data bricks by Eugene Polonichko
Azure data bricks by Eugene PolonichkoAzure data bricks by Eugene Polonichko
Azure data bricks by Eugene Polonichko
 
Sdlc by Anatoliy Anthony Cox
Sdlc by  Anatoliy Anthony CoxSdlc by  Anatoliy Anthony Cox
Sdlc by Anatoliy Anthony Cox
 
Kostenko ux november-2014_1
Kostenko ux november-2014_1Kostenko ux november-2014_1
Kostenko ux november-2014_1
 
Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3
 
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас..."Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
 
Spring.new hope.1.3
Spring.new hope.1.3Spring.new hope.1.3
Spring.new hope.1.3
 
Navigation map factory by Alexey Klimenko
Navigation map factory by Alexey KlimenkoNavigation map factory by Alexey Klimenko
Navigation map factory by Alexey Klimenko
 
Serialization and performance by Sergey Morenets
Serialization and performance by Sergey MorenetsSerialization and performance by Sergey Morenets
Serialization and performance by Sergey Morenets
 
Игры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей РыбаковИгры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей Рыбаков
 
Android sync adapter
Android sync adapterAndroid sync adapter
Android sync adapter
 
Неформальные размышления о сертификации в IT
Неформальные размышления о сертификации в ITНеформальные размышления о сертификации в IT
Неформальные размышления о сертификации в IT
 
Разработка расширений Firefox
Разработка расширений FirefoxРазработка расширений Firefox
Разработка расширений Firefox
 
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So..."AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
 
Lambda выражения и Java 8
Lambda выражения и Java 8Lambda выражения и Java 8
Lambda выражения и Java 8
 
XP практики в проектах с тяжелой наследственностью
XP практики в проектах с тяжелой наследственностьюXP практики в проектах с тяжелой наследственностью
XP практики в проектах с тяжелой наследственностью
 
Anti patterns
Anti patternsAnti patterns
Anti patterns
 
Первые шаги во фрилансе
Первые шаги во фрилансеПервые шаги во фрилансе
Первые шаги во фрилансе
 
Spring Web Flow. A little flow of happiness.
Spring Web Flow. A little flow of happiness.Spring Web Flow. A little flow of happiness.
Spring Web Flow. A little flow of happiness.
 

Async clinic by by Sergey Teplyakov

  • 1. Асинхронное программирование Сергей Тепляков, Visual C# MVP .NET Architect at Luxoft SergeyTeplyakov.blogspot.com
  • 2. Sync vs Async Synchronous Perform something here and now. I’ll regain control to execute something else when it’s done. Asynchronous
  • 4. Sync vs Async Caller Srv Foo 42 Caller Srv Operation finished Result: 42 FooAsync Operation Started Bckgn Starting background operation Notifies t t t0 Sync vs Async
  • 5. Sync vs Async var webRequest = WebRequest.Create(Url); using (var response = webRequest.GetResponse()) { using (var file = new FileStream(FileName, FileMode.OpenOrCreate)) { var length = response.ContentLength; var textWriter = new StreamWriter(file); textWriter.Write(length.ToString()); textWriter.Close(); } }
  • 6. Sync vs Async (2) var webRequest = WebRequest.Create(Url); using (var response = await webRequest.GetResponseAsync()) { using (var file = new FileStream(FileName, FileMode.OpenOrCreate)) { var length = response.ContentLength; var textWriter = new StreamWriter(file); await textWriter.WriteAsync(length.ToString()); textWriter.Close(); } }
  • 7. Копайте в глубь! Все нетривиальные абстракции дырявы Джоэл Спольски «Закон дырявых абстракций» Вы должны понимать как минимум на один уровень абстракции ниже того уровня, на котором вы кодируете Ли Кэмпбел (Lee Campbell)
  • 8. Async/await – лишь вершина
  • 9. Async/Await Sample public async Task AsyncMethod(string url, string fileName) { var webRequest = WebRequest.Create(url); Task<WebResponse> tResp = webRequest.GetResponseAsync(); WebResponse response = await tResp; var responseStream = response.GetResponseStream(); var tr = new StreamReader(responseStream); Task<string> tContent = tr.ReadToEndAsync(); string content = await tContent; var file = File.OpenWrite(fileName); var streamWriter = new StreamWriter(file); Task writeResult = streamWriter.WriteAsync(content); await writeResult; Console.WriteLine("AsyncMethod finished"); }
  • 10. Async/Await Sample Код Поток var webRequest = WebRequest.Create(url); Task<WebResponse> tResp = webRequest.GetResponseAsync(); Вызывающий поток Await возвращает управление вызывающему коду WebResponse response = await tResp; var responseStream = response.GetResponseStream(); var tr = new StreamReader(responseStream); Task<string> tContent = tr.ReadToEndAsync(); Поток 2 Await возвращает управление вызывающему коду string content = await tContent; var file = File.OpenWrite(fileName); var streamWriter = new StreamWriter(file); Task writeResult = streamWriter.WriteAsync(content); Поток 3 Await возвращает управление вызывающему коду await writeResult; Console.WriteLine("AsyncMethod finished"); Поток 4 Метод завершен успешно
  • 11. Async vs. Tasks public async Task SimpleAsync(string url) { var webRequest = WebRequest.Create(url); Task<WebResponse> tResp = webRequest.GetResponseAsync(); WebResponse response = await tResp; Console.WriteLine("Got the response"); } public Task AsyncMethodImpl(string url) { var webRequest = WebRequest.Create(url); Task<WebResponse> tResp = webRequest.GetResponseAsync(); return tResp.ContinueWith(t => { Console.WriteLine("Got the response"); }, TaskScheduler.FromCurrentSynchronizationContext()); }
  • 12. Synchronization Context • Некоторые типы приложений налагают ограничения на «потоковую» модель • Control.Invoke/BeginInvoke • Dispatcher.Invoke/BeginInvoke • Контекст синхронизации «прячет» эти детали за абстрактным интерфейсом • Контекст нужен для «маршалинга» управления из одного потока в другой (*) • Контексты повсюду!
  • 13. Зачем мне это? Я же программирую на C# 5.0!
  • 14. Что будет в этом случае? private async Task<int> Foo() { buttonRun.Enabled = false; await LongRunningTask(); buttonRun.Enabled = true; return 42; } private void btn_Click(object sender, EventArgs e) { label.Text = FooAsync().Result.ToString(); } «Продолжение» должно вызываться в UI потоке Ожидает завершения асинхронной операции Захватываем Sync Context Возвращает управление!
  • 15. “Sync over Async” + UI == Deadlock!
  • 16. Решение private async Task<int> Foo() { buttonRun.Enabled = false; await LongRunningTask(); buttonRun.Enabled = true; return 42; } private async void buttonRun_Click(object sender, EventArgs e) { textBoxStatus.Text = ""; textBoxStatus.Text = (await Foo()).ToString(); }
  • 17. Паттерны асинхронного программирования • Asynchronous Programming Model (APM) • BeginInvoke/EndInvoke • Event-Based Async Pattern (EAP) • BackgroundWorker: RunWorkerAsync, RunWorkerCompleted • Bicycle –Async Pattern (BAP) • Кастомные решения • Task-Based Async Pattern (TAP) • Task<int> ReadAsync
  • 18. Exception Handling Task.Result Task.Wait await task; FirstException AggregateExceptionfails fails
  • 20. Где вылетит ошибка? var ms = new MemoryStream(); // Здесь? Task<int> task = ms.ReadAsync(null, 0, 42); // Или здесь? int result = task.Result; • Является исключение «синхронным» или «асинхронным»?
  • 21. «Наивная» реализация public static async Task<int> ReadAsync(byte[] buffer) { if (buffer == null) throw new ArgumentNullException("buffer"); // Реализация асинхронного чтения return 42; } Результирующая задача перейдет в Faulted состояние! • Синхронное исключение означает «баг» в вызывающем коде. • «Поломанная» задача означает баг в реализации! Зачем заморачиваться?
  • 22. Корректная реализация public static Task<int> ReadAsync(byte[] buffer) { if (buffer == null) throw new ArgumentNullException("buffer"); return ReadAsyncImpl(buffer); } private static async Task<int> ReadAsyncImpl(byte[] buffer) { // Реализация асинхронногочтения return 42; } Синхронная проверка «предусловий»
  • 24. Обработка нескольких исключений public static async Task FooAsync() { // t1 "падает" Task<int> t1 = Task<int>.Factory.StartNew(() => { throw new Exception("E1"); }); // t2 тоже "падает" Task<int> t2 = Task<int>.Factory.StartNew(() => { throw new Exception("E2"); }); int r1 = await t1; int r2 = await t2; } Получим “E1”? Получим “E2”? Получим AggregateException? UnobservedTaskException!
  • 25. Unobserved Exceptions • Событие TaskScheduler.UnobservedException • Генерируется финализатором • Не вызывается при обращении к • Result • Exception • Вызове Wait • Поведение зависит от версии .NET Framework • .NET 4.5 – «умалчивается» (*) • .NET 4.0 – «ломает» приложение
  • 26. Await исключений public static async Task<int> SimpleAsync() { throw new CustomException(); } public static async void ConsumeSimpleAsync() { var task = SimpleAsync(); try { // "Разыменовывание" задачи приводит к // "разворачиванию" первого исключения! int result = await task; } catch (CustomException) { Console.WriteLine("Yahoo!!!"); } }
  • 27. “Решение” public static async Task FooAsync() { // t1 "падает" Task<int> t1 = Task<int>.Factory.StartNew(() => { throw new Exception("E1"); }); // t2 тоже "падает" Task<int> t2 = Task<int>.Factory.StartNew(() => { throw new Exception("E2"); }); // "Наблюдаем" оба исключения var task = Task.WhenAll(t1, t2); await task.ContinueWith(_ => _.Result); int r1 = t1.Result; int r2 = t2.Result; } «Объединяем» обе задачи await task; пробросил бы лишь первое исключение!Явно генерируем AggregateException!!!!
  • 28. И как это дело ловить? var task = Modified.FooAsync(); try { await task; } // Для случая более одного исключения catch (AggregateException e) { // "Выпрямляем" все исключения int count = e.Flatten().InnerExceptions.Count; Console.WriteLine( "Demo2.Modified.FooAsync failed with {0} exceptions", count); } // Для более простых случаев catch (CustomException e) { } catch (Exception e) {}
  • 29. Асинхронные методы • Типы возвращаемого значения асинхронного метода: • async void FooAasync() – Fire and Forget (*) • async Task FooAsync() – (void Foo()) • async Task<T> FooAsync() – (T Foo())
  • 31. Async Guidelines • Async void – это операции вида “fire-and-forget” • Вызывающий код не может узнать о завершении асинхронного метода • Вызывающий код не может обработать исключения (вместо этого они попадут в цикл обработки UI сообщений) • Используйте async void только для обработчиков событий самого высокого уровня. • Используйте возвращаемые значения! • Осторожнее с асинхронными лямбда-выражениями!
  • 32. Сколько же тут всего… • Влияние TAP на дизайн приложения! • Обработка исключений • Unobserved exceptions • Bugs vs Task Faults • Гранулярность асинхронных операций • Testability • Work stealing • Async Programming Guidelines • Avoid “async void” • Avoid async lambdas • Consider performance impact • Avoid “Sync over Async” • Avoid “Async over Sync” • Consider using ConfigureAwait
  • 33. Вот этого не надо - Как вы пишите софт? - Бац-бац и в продакшн (с). - Как из синхронного приложения сделать асинхронное? - Async/await и готово!
  • 35. Спасибо за внимание • Сергей Тепляков, Visual C# MVP • .NET Architect at Luxoft • Sergey.Teplyakov@gmail.com • http://sergeyteplyakov.blogspot.com/
  • 36. Что думает по этому поводу Eric Lippert? Q: C# 5.0 has new feature called async/await. Why should developers be excited about it? A: People like me, are excited about this feature because its a cooperative multitasking with coroutines implementing using continuation passing style.

Hinweis der Redaktion

  1. Просто для того, чтобы с чего-нибудь начать разговор и подойти к сегодняшней теме я бы хотел немного напомнить историю развития платформы .NET и языка C#. Это даст нам понять то, как же мы докатились до такой жизни.В целом, нас интересует два последних релиза языка C#, которые и дали основной толчок асинхронному программированию на платформе .NET.И да, вам не послышалось и я не оговорился, именно два последних релиза сделали асинхронное программирование таким, каким мы его знаем сегодня, а не один последний релиз.ВC# 4.0 (а точнее в .NET Framework 4.0) появилась TPL, а в C# 5.0 (и .NET 4.5) эта модель асинхронного программирования стала повсеместной; и не последнюю роль в этом вопросе сыграли новые возможности языков C# и VB.NET.Давайте посмотрим, к чему же мы стремились.
  2. С одной стороны, асинхронное программирование на платформе .NET существовало с самой первой ее версии (в виде так называемой Asynchronous Programming Model), а с другой стороны асинхронное программирование всегда было на порядок сложнее с точки зрения реализации, отладки и сопровождения, по сравнению с синхронной версией.Основная же цель новых «асинхронных» возможностей языка C# была направлена на «унификацию» синхронного и асинхронного программирования. Решить проблему асинхронности путем добавления пары ключевых слов в тело и заголовок методов, чтобы сделать их асинхронными.И это просто прекрасно, но сразу же после выхода этого дела в свет стало ясно, что у этой простоты есть своя цена! На самом деле, я могу
  3. TODO: выделить ключевые слова и Async, чтобы изменения были более видны
  4. Абстракции текут и чтобы понимать что-то нам нужно разбираться на один уровень абстракции ниже!
  5. Обязательно сказать и продумать про разные типы приложений!!
  6. Когда речь заходит за UI потоки, то любой join асинхронной операции может привести к deadlock-у. В этом случае работает следующее правило: если вы начали использовать асинхронные операции, то их следует продолжать использование, а не ожидать их завершения (явно или неявно).
  7. TODO:Рисунок
  8. Что будет в этом случае? Будет ли проброшено исключение первой задачи, второй задачи, обеих задач в виде AggregateException?
  9. Очень печально, но в данном случае наружу вылетит лишь первое из возникших исключений!Я так и не смог добиться получения наружу обоих исключений!!
  10. PrinciplesAsync void is a “fire-and-forget” mechanism...The caller is unable to know when an async void has finishedThe caller is unable to catch exceptions thrown from an async void(instead they get posted to the UI message-loop)GuidanceUse async void methods only for top-level event handlers (and their like)Use async Task-returning methods everywhere elseWhen you see an async lambda, verify it
  11. Сказать о том, что IO Bound операции вообще не требуют физических потоков ОС. Мы не просто усыпим поток ОС, мы вообще не будем их использовать, поскольку все, что нам потребуется, это создать небольшой объект (представляющий собой callback от ОС) и передать его соответствующей функции. Когда операция будет завершена (без участия ЦПУ), то этот callback будет вызван.
  12. Речь идет об открытых методах! Прикладной разработчик и сам сможет запустить ее асинхронно (чтобы не блокировать UI), исходя из своих собственных требований.Когда же мы говорим о публичном интерфейсе сборки или о библиотеке, то мы должны понимать, что любая асинхронная версия подразумевает возможность ее многократного вызова без негативного влияния на производительность системы.