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

В этом разделе описывается асинхронное программирование в универсальная платформа Windows (UWP) и его представление в C#, Microsoft Visual Basic .NET, C++ и JavaScript.

Использование асинхронного программирования позволит вашему приложению отвечать на запросы во время выполнения длительных операций. Например, приложение, скачивающее содержимое из Интернета, может ожидать получения данных несколько секунд. Если для получения содержимого вы использовали синхронный метод в потоке пользовательского интерфейса, приложение блокируется до момента возврата из метода. Приложение при этом не будет отвечать на действия пользователя и будет казаться зависшим, что может вызвать раздражение пользователя. В такой ситуации гораздо эффективнее использовать асинхронное программирование, которое позволит приложению работать и отвечать на запросы пользовательского интерфейса, одновременно ожидая завершения операции.

Для методов, выполняющихся в течение длительного времени, применение асинхронного программирования является нормой, и в этом смысле UWP — не исключение. JavaScript, C#, Visual Basic и C++ обеспечивают языковую поддержку асинхронных методов.

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

Многие функции UWP, такие как API MediaCapture и API StorageFile , предоставляются в виде асинхронных API. По соглашению имена асинхронных API заканчиваются на "Async", чтобы указать, что часть их выполнения, скорее всего, будет выполняться после возвращения элемента управления вызывающей объекту.

При использовании асинхронных API в коде вашего приложения UWP согласованно выполняются неблокирующие вызовы. Если вы будете применять эти асинхронные шаблоны в собственных определениях API, вызывающие объекты будут предсказуемо интерпретировать и использовать ваш код.

Ниже приведены некоторые распространенные задачи, требующие вызова асинхронных API среда выполнения Windows.

  • Отображение окна сообщения

  • Работа с файловой системой, с отображением средства выбора файлов

  • Отправка и получение данных из Интернета

  • Использование сокетов, потоков, подключений

  • Работа со встречами, контактами, календарем

  • Работа с типами файлов, например открытие PDF-файлов, декодирование форматов изображений или мультимедиа

  • Взаимодействие с устройством или службой

При использовании асинхронной модели UWP вам, возможно, вовсе не придется явным образом управлять потоками. В каждом языке программирования имеется свой способ поддержки асинхронной модели для UWP.

Язык программирования Асинхронное представление
C# асинхронный ключевое слово, оператор await
Visual Basic ключевое слово Async, оператор Await
C++/WinRT сопрограмма и оператор co_await
C++/CX класс task, метод .then
JavaScript объект Promise, функция then

Асинхронные шаблоны в UWP на C# и Visual Basic

Обычно код, написанный на C# или Visual Basic, выполняется синхронно, то есть выполнение кода предыдущей строки завершается перед началом выполнения следующей. Для асинхронного выполнения кода использовались прошлые модели программирования Microsoft .NET, но большая часть результирующего кода была посвящена реализации асинхронности, а не задаче, которая решалась с помощью этого кода. В UWP, .NET Framework и компиляторах C# и Visual Basic существуют дополнительные компоненты, которые выделяют из кода асинхронные механизмы. Для .NET и UWP вы можете написать асинхронный код, ориентированный на задачу, а не на способ или время ее выполнения. Асинхронный код в целом схож с синхронным. Подробнее см. в разделе Вызов асинхронных API в C# и Visual Basic.

Асинхронные шаблоны в UWP с C++/WinRT

В C++/WinRT используются сопрограммы и оператор co_await . Дополнительные сведения и примеры кода см. в статье Асинхронное программирование в C++/WinRT.

Асинхронные шаблоны в UWP с помощью C++/CX

В C++/CX асинхронное программирование основано на классе task class и относящемся к нему методе then method. Синтаксис похож на синтаксис объектов Promise в JavaScript. Класс task class и связанные с ним типы также предоставляют возможности отмены и управления контекстом потока. Дополнительные сведения см. в разделе Асинхронное программирование в C++/CX.

Функция create_async обеспечивает поддержку создания асинхронных API, которые можно использовать из JavaScript или любого другого языка, поддерживающего UWP. Дополнительные сведения см. в разделе Создание асинхронных операций в C++/CX.

Асинхронные шаблоны в UWP на JavaScript

В JavaScript асинхронное программирование следует предложенному стандарту Common JS Promises/A, в соответствии с которым асинхронные методы возвращают объекты Promise. Объекты Promise используются в UWP и в библиотеке Windows для JavaScript.

Объект Promise представляет собой значение, которое будет сформировано в будущем. В UWP вы получаете объект Promise из функции фабрики, которая по правилам имеет имя, оканчивающееся словом «Async».

Во многих случаях вызов асинхронной функции так же прост, как и вызов обычной функции. Различие в том, что вам нужно использовать метод then или done, чтобы назначить обработчики для формирования результата, обработки ошибок и запуска операции.