
Асинхронность.pptx
- Количество слайдов: 14
C# 5 и асинхронное программирование
Асинхронность Асинхронный вызов – это такой вызов функции при котором программа не дожидается выполнения метода вызванного ранее перед запуском последующего
Главное — мы потеряем возможность взаимодействия с пользовательским интерфейсом до завершения операции. Зачем так усложнять жизнь разработчикам? Дело в том, что пользовательский интерфейс обрабатывает метод синхронно и, передав обработку какому-либо методу, не может выполнять действия пользователя, пока этот метод не будет завершен. Асинхронные операции достаточно легко решают эту проблему.
Создадим простое WPF-приложение и добавим кнопку с текстовым полем в окно Main. Window. xaml Сетевое взаимодействие должно выполняться асинхронно Title="Main. Window" Height="600" Width="800">
Синхронный вызов Download. String public partial class Main. Window : Window Сетевое взаимодействие должно выполняться асинхронно { public Main. Window() { Initialize. Component(); } private void Button_Click(object sender, Routed. Event. Args e) { var client = new Web. Client(); txt. Result. Text = client. Download. String("http: //akhmed. ru"); } }
Асинхронный вызов с обработкой результата в отдельном методе private void Button_Click(object sender, Routed. Event. Args e) Сетевое взаимодействие должно выполняться асинхронно { var client = new Web. Client(); client. Download. String. Completed += Client. Download. String. Completed; client. Download. String. Async(new Uri("http: //akhmed. ru")); } void Client. Download. String. Completed(object sender, Download. String. Completed. Event. Args e) { txt. Result. Text = e. Result; }
Для сокращения объема кода воспользуемся анонимными методами. Сетевое взаимодействие должно выполняться асинхронно private void Button_Click(object sender, Routed. Event. Args e) { var client = new Web. Client(); client. Download. String. Completed += (s, a) => { txt. Result. Text = a. Result; }; client. Download. String. Async(new Uri("http: //akhmed. ru")); }
Ключевые слова async и await в C# 5
Рассмотрим, как наш пример WPF-приложения будет выглядеть с учетом новых возможностей. private async void Button_Click(object sender, Routed. Event. Args e) Два ключевых слова: async и await { var client = new Web. Client(); var uri = new Uri("http: //akhmed. ru"); txt. Result. Text = await client. Download. String. Task. Async(uri); } В данном примере кода мы загружаем данные с помощью асинхронного метода Download. String. Task. Async, который возвращает объект класса Task
Два ключевых слова: async и await Одно из самых значительных и полезных изменений в Windows 8 — полный отказ от синхронных операций везде, где потенциально возможно долгое выполнение. Чтение файлов, загрузка и передача данных — практически все работает асинхронно. Рассмотрим, как реализовать загрузку данных по http в Windows Store-приложении. private async void Button_Click(object sender, Routed. Event. Args e) { var client = new Http. Client(); txt. Result. Text = await client. Get. String. Async("http: //habr. ru"); }
Напишем код с ключевыми словами async и await, подсчитывающий сумму размера страниц трех сайтов private async void Button_Click(object sender, Routed. Event. Args e) { var content. Habrahabr = await new Более сложный пример Http. Client(). Get. String. Async("http: //habrahabr. ru"); var content. Yandex = await new Http. Client(). Get. String. Async("http: //yandex. ru"); var content. Mail = await new Http. Client(). Get. String. Async("http: //mail. ru"); var length = content. Habrahabr. Length + content. Yandex. Length + content. Mail. Length; txt. Result. Text = length. To. String(); }
Класс Task предоставляет достаточно богатые возможности для работы с асинхронными задачами. Допустим, необходимо организовать более эффективное скачивание данных, загружая страницы не последовательно, а параллельно. Класс Task в том числе предоставляет метод When. All, который позволяет нам ожидать выполнения всех переданных ему задач (листинг П 2. 11). private async void Button_Click(object sender, Routed. Event. Args e) { var task. Habrahabr = Класс Task и метод When. All new Http. Client(). Get. String. Async("http: //habrahabr. ru"); var task. Yandex = new Http. Client(). Get. String. Async("http: //yandex. ru"); var task. Mail = new Http. Client(). Get. String. Async("http: //mail. ru"); await Task. When. All(task. Habrahabr, task. Yandex, task. Mail); var length = task. Habrahabr. Result. Length + task. Yandex. Result. Length + task. Mail. Result. Length; txt. Result. Text = length. To. String(); } Теперь страницы загружаются существенно быстрее. Мы не ждем окончания загрузки первой страницы, чтобы начать скачивание второй и т. д.
Итоги
Итоги Ключевые слова async и await в C# 5 позволяют писать асинхронный код в синхронном стиле. Реальная работа осуществляется с помощью классов задач Task и Task