msdevcon.ru#msdevcon
Работа с асинхронными операциями в Win RT Иван Бодягин ABBYY
Содержание Асинхронность Win RT Реализация асинхронности в Win RT async/await + Task Сценарии
Асинхронность
Закон Мура перестал приносить дивиденды Рост числа транзисторов не приводит к линейному росту производительности В некоторых сценариях без асинхронности не обойтись Пользовательский интерфейс Массовая обработка запросов
Пользовательский интерфейс Место, где проблемы с асинхронностью проявляются наиболее ярко UI всегда должен быть асинхронным Если поток UI занят длительной обработкой, то приложение не реагирует на действия пользователя Все обращения к UI должны происходить из одного потока
Решения Делегаты и события Ручное управление потоками, логика серьезно усложняется Continuation Passing Style Позволяет сделать логику линейной, но многословно Reactive Extension Запросы к событиям – идеальное решение, но в малом числе сценариев async / await Делает логику линейной и не обременяет синтаксисом
Win RT
Альтернативный / эволюционный API Объектно-ориентированный (что бы под этим не понимали) Поддержка метаданных «нативная» поддержка управляемых языков Некоторые операции сделаны исключительно асинхронными Стимулирует разработчиков писать код не блокирующий UI
Асинхронные операции
Матрица операций ДаНет ДаIAsyncOperationWithProgressIAsyncActionWithProgress НетIAsyncOperationIAsyncAction Result Progress
DEMO Длительные операции и UI
Как это работает?
Синтаксис async - ключевое слово перед методом содержащим асинхронные операции Этот метод содержит асинхронные операции и будет изменен компилятором таким образом, чтобы после асинхронного вызова метод мог быть продолжен с нужного места. await – ключевое слово перед асинхронной операцией Остаток метода сделать «продолжением» (continuation) и вернуть управление вызывающему потоку. «продолжение» будет вызвано тогда, когда ожидаемый вызов завершится.
Awaitable pattern Должен быть реализован метод GetAwaiter() Метод должен возвращать класс реализующий bool IsCompleted { get; } void OnCompleted(Action continuation); TResult GetResult();
Преобразования компилятора
Контекст синхронизации await возвращает управление в «текущий контекст синхронизации» SynchronizationContext.Current TaskSheduler.Current Если SynchronizationContext определен, (ASP.Net, WPF, WinForms, SL, Win RT…), то он используется и есть гарантия корректной работы с UI Если не определен, то берется поток из ThreadPool-а
Поддержка Task Parallel Library Реализовать поддержку await в классе можно двумя способами Реализовать полноценный await pattern Воспользоваться TaskCompletionSource Для всех IAsync классов, уже есть соответствующие методы расширения public static Task AsTask (…)
Проблема выбора await SomeAsync() vs await SomeAsync().AsTask() Встроенный GetAwaiter реализует.AsTask().GetAwaiter() Использование AsTask дает больше контроля
AsTask() Поддержка CancellationToken
AsTask() Поддержка IProgress
AsTask() Настройки маршаллинга По умолчанию используется контекст синхронизации для передачи управления в UI поток после await операции WinRTSynchronizationContext
AsTask() Использование цепочек продолжений… и комбинаторов
Заключение Асинхронные операции очень важны, особенно в UI В Win RT некоторые операции могут быть только асинхронными Все эти операции реализуют набор интерфейсов и эти интерфейсы поддерживают await паттерн (await/async) Await паттерн позволяет линейно писать асинхронный код В простых сценариях await можно использовать напрямую с этими операциями, для сложных сценариев есть AsTask()
Контакты Иван Бодягин ABBYY
© 2013 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.