异步操作

推荐使用操作的异步版本,而不是同步版本(如果适用)。

在代码通知同步操作运行时即立刻开始运行,而且代码会等待此操作完成后才会继续执行其他操作。因此,它们在帧循环的应用程序代码阶段运行。如果同步操作需要的时间太长,它将扩展帧循环的大小,这可能会导致显示冻结或不连贯。

当代码执行异步操作时,不必立即运行。代码和当前执行线程中的其他应用程序代码会继续执行。然后,运行时在尝试阻止呈现问题的同时会尽快执行此操作。在某些情况下,执行操作会在后台发生,且根本不会作为运行时帧循环的一部分运行。最后,当操作完成时,运行时会调度一个事件,且代码可以侦听该事件以执行进一步操作。

安排异步操作并将其拆分为几部分以避免出现呈现问题。因此,使响应应用程序使用操作的异步版本要容易得多。有关详细信息,请参阅 感知性能与实际性能

但是,异步运行操作会产生一些开销。异步操作的实际执行时间可能更长,尤其是那些短时间完成的操作。

在运行时中,许多操作本身就是同步操作或异步操作,因此您无法选择如何执行这些操作。然而,在 Adobe AIR 中,有三种类型的操作可供您选择是采用同步执行还是异步执行:

  • File 和 FileStream 类操作

    File 类的许多操作既可以同步执行,也可以异步执行。例如,复制或删除文件或目录以及列出目录的内容的方法都采用异步版本。这些方法包含添加到异步版本名称中的后缀“Async”。例如,要异步删除一个文件,请调用 File.deleteFileAsync() 方法,而不是 File.deleteFile() 方法。

    当使用 FileStream 对象读取或写入文件时,打开 FileStream 对象的方式决定是否异步执行操作。使用 FileStream.openAsync() 方法执行异步操作。采用异步方式执行数据写入。数据读取分区块完成,因此每次只有部分数据可用。相比而言,在同步模式下,FileStream 对象读取整个文件,然后才继续执行代码。

  • 本地 SQL 数据库操作

    使用本地 SQL 数据库时,通过 SQLConnection 对象执行的所有操作可以在同步模式下执行,也可以在异步模式下执行。要指定采用异步方式执行操作,请使用 SQLConnection.openAsync() 方法代替 SQLConnection.open() 方法打开到数据库的连接。当数据库操作采用异步方式运行时,将在后台执行。数据库引擎根本不在运行时帧循环中运行,因此数据库操作不太可能导致呈现问题。

    有关提高本地 SQL 数据库性能的其他策略,请参阅 SQL 数据库性能

  • Pixel Bender 独立着色器

    ShaderJob 类允许您通过 Pixel Bender 着色器运行图像或数据集以及访问原始结果数据。默认情况下,当调用 ShaderJob.start() 方法时,着色器以异步方式执行。执行发生在后台,不使用运行时帧循环。要强制 ShaderJob 对象以异步方式执行(不建议这样做),请将值 true 传递给 start() 方法的第一个参数。

除用于异步运行代码的这些内置机制之外,您还可以构建自己的代码来异步运行而不是同步运行。如果您正在编写的代码用来执行可能会长期运行的任务,您可以构建自己的代码,以便分部分执行。将您的代码拆分为几部分允许运行时在代码执行块之间执行其呈现操作,从而尽可能减少呈现问题。

下面列出了几种用于拆分代码的技术。所有这些技术的主旨是编写的代码在任何时候仅执行其部分工作。可以跟踪代码执行的操作以及停止运行的位置。使用某种机制(例如 Timer 对象)反复检查工作是否仍在进行并分区块执行其他工作,直到完成此工作。

建立了几个模式可用于以此种方式构建代码以拆分工作。下列文章和代码库介绍了这些模式,并提供了代码以帮助您在应用程序中实施这些模式: