Introducing 

Prezi AI.

Your new presentation assistant.

Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.

Loading…
Transcript

Язык программирования C#.

Асинхронное программирование

Руслан Гибадуллин

Принципы асинхронности

Тема 1

Принципы асинхронности

Синхронная операция

выполняет свою работу перед возвратом управления вызывающему коду.

Синхронно

Примеры:

  • List<T>.Add;
  • Console.WriteLine;
  • Thread.Sleep.

Асинхронная операция

выполняет (большую часть или всю) свою работу после возврата управления вызывающему коду.

Асинхронно

Примеры:

  • Thread.Start;
  • Task.Run;
  • методы, которые присоединяют признаки продолжения к задачам.

Тема 2

Что собой представляет асинхронное программирование?

Что собой представляет асинхронное программирование?

Принцип асинхронного программирования состоит в том, что длительно выполняющиеся функции реализуются асинхронным образом. Он отличается от традиционного подхода синхронной реализации длительно выполняющихся функций с последующим их вызовом в новом потоке или в задаче для введения параллелизма по мере необходимости.

Параллельное выполнение

Параллельное выполнение с интенсивным вводом-выводом может быть реализовано без связывания потоков (как далее будет продемонстрировано с применением класса TaskCompletionSource), улучшая показатели масштабируемости и эффективности.

Класс TaskCompletionSource

Класс TaskCompletionSource

Данный класс открывает доступ к свойству Task, возвращающему объект задачи, для которой можно организовать ожидание и присоединить признак продолжения – как делается с любой другой задачей.

Пример 1

Пример 2

Обогащенные клиентские приложения в итоге содержат меньше кода в рабочих потоках, что упрощает достижение безопасности в отношении потоков. Это особенно актуально с ростом размера программы, поскольку для борьбы со сложностью мы обычно проводим рефакторинг крупных методов в методы меньших размеров, получая в результате цепочки методов, которые вызывают друг друга (графы вызовов).

Обогащенные клиентские

приложения

Асинхронное

программирование

и продолжение

Тема 3

В случае методов с интенсивными вычислениями для инициирования параллелизма, связанного с потоками, мы применяем метод Task.Run. Асинхронный метод создается просто за счет возвращения вызывающему компоненту объекта задачи.

Асинхронное программирование и продолжение

Продемонстрируем метод, который

вызывает GetPrimesCount:

Пример

Вывод

Вот как выглядит вывод:

Для реализации асинхронного подхода:

  • напишем асинхронную версию метода GetPrimesCount;
  • устраним цикл for и реализуем рекурсивный вызов в продолжении.

Модификация 1

Сделаем метод DisplayPrimesCount

асинхронным.

Модификация 2

К счастью, асинхронные функции C# делают всю работу подобного рода благодаря новым ключевым словам async и await:

Важность языковой поддержки

Ожидание

Тема 4

Ключевое слово await упрощает присоединение признаков продолжения. Рассмотрим базовый сценарий. Приведенные ниже строки:

var результат = await выражение;

оператор(ы);

компилятор развернет в следующий функциональный эквивалент:

var awaiter = выражение.GetAwaiter();

awaiter.OnCompleted(() =>

{

var результат = awaiter.GetResult();

оператор(ы);

);

Ожидание

Модификатор async может применяться только к методам (и лямбда-выражениям), которые возвращают void либо тип Task или Task<TResult>.

Применение

async и await

Логическое расширение показанного ранее асинхронного метода:

Логическое расширение

асинхонного метода

Реальная мощь выражений await заключается в том, что они могут находиться практически в любом месте кода. В следующем примере await располагается внутри цикла:

Захват локального

состояния

Ожидание в пользовательском интерфейсе

Тема 5

Продемонстрируем асинхронные функции в более практичном контексте, реализовав простой пользовательский интерфейс, который остается отзывчивым во время вызова метода с интенсивными вычислениями.

Ожидание в пользовательском интерфейсе

После щелчка на кнопке Go приложение перестает быть отзывчивым на время, необходимое для выполнения кода с интенсивными вычислениями.

Синхронное решение

Решение превращается в асинхронное за два шага:

1. переключение на асинхронную версию метода GetPrimesCount;

2. изменение метода Go для вызова метода GetPrimesCountAsync.

Асинхронное решение

Рассмотрим еще один пример, в котором вместо вычисления простых чисел загружается несколько веб-страниц с суммированием их длин.

Ещё один пример

Обработчики событий, присоединяемые к элементам пользовательского интерфейса, выполняются через такой цикл сообщений.

Что в точности происходит?

while (приложение не завершено)

{

Ожидать появления чего-нибудь в очереди сообщений

Что-то получено: к какому вид у сообщений оно относится?

Сообщение клавиатуры/мыши -> запустить обработчик событий

Пользовательское сообщение Beginlnvoke/Invoke -> выполнить делегат

}

Learn more about creating dynamic, engaging presentations with Prezi