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

По возможности используйте вместо синхронных операций их асинхронные аналоги.

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

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

Выполнение асинхронных операций планируется так, чтобы они не вызвали проблем с визуализацией. Следовательно, для обеспечения быстродействия приложения лучше использовать асинхронные версии операций. Дополнительные сведения см. в разделе « Ощущаемая и фактическая производительность ».

Но асинхронное выполнение операций влечет некоторые потери. Фактическое время выполнения может увеличиваться при выполнении асинхронных операций, особенно операций, которые выполняются быстро.

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

  • Операции классов File и FileStream

    Многие операции класса File могут быть выполнены синхронно или асинхронно. Например, для операций копирования или удаления файла или каталога, а также отображения содержимого каталога, существуют как синхронные, так и асинхронные версии. Эти методы имеют суффикс Async, добавленный к названию асинхронной версии. Например, чтобы выполнить асинхронную операцию удаления файла, необходимо вместо метода File.deleteFile вызвать метод File.deleteFileAsync() .

    При использовании объекта FileStream для считывания или записи файла способ открытия объекта FileStream определяет необходимость выполнения операций в асинхронном режиме. Для выполнения асинхронных операций используйте метод FileStream.openAsync() . Запись данных производится в асинхронном режиме. Чтение данных производится поблочно, поэтому одновременно доступна только часть данных. И наоборот, в синхронном режиме объект FileStream сначала завершает чтение всего файла, и лишь затем время выполнения продолжает выполнять код.

  • Операции с локальной базой данных SQL

    При работе с локальной базой данных SQL все операции с использованием объекта SQLConnection можно выполнить либо в синхронном, либо в асинхронном режиме. Чтобы выполнить операции в асинхронном режиме, установите подключение к базе данных, используя метод SQLConnection.openAsync() вместо метода SQLConnection.open() . Асинхронные операции с базой данных выполняются в фоне. Таким образом, механизм базы данных не связан с циклом кадра среды выполнения, поэтому при выполнении операций с базой данных возникновение проблем с визуализацией маловероятно.

    Полезные советы по повышению производительности обмена данными с базой данных SQL см. в разделе « Производительность базы данных SQL ».

  • Автономные шейдеры Pixel Bender

    Класс ShaderJob дает возможность пропускать изображение или набор данных через шейдер Pixel Bender и получать доступ к несжатым полученным данным. По умолчанию при вызове метода ShaderJob.start() шейдер выполняется асинхронно. Выполнение производится в фоновом режиме и не связано с циклом кадра среды выполнения. Чтобы объект ShaderJob выполнялся синхронно (не рекомендуется), необходимо передать первому параметру метода start() значение true .

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

Ниже перечислено несколько способов разбивки кода. Главная идея всех этих способов заключается в том, чтобы в определенное время выполнить только часть операции. Задача разработчика определить выполняемую кодом операцию и задать временные рамки ее выполнения. Для отслеживания оставшейся работы и выделения отрезков времени для ее дальнейшего выполнения воспользуйтесь механизмом Timer.

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