异步代理

异步代理(或只称作代理)是以异步方式与其他代理一起解决更大的计算任务的应用程序组件。 将代理看作具有设定的生命周期的任务。 例如,一个代理可能会从输入/输出设备(如键盘、磁盘上的文件或网络连接)中读取数据,另一个代理可能会在数据变得可用时对该数据执行操作。 第一个代理通过消息传递来通知第二个代理有更多数据可用。 并发运行时任务计划程序提供了一个高效的机制,使代理能够以协作方式进行阻止和退出,而无需进行效率低下的抢占。

代理库定义了 Concurrency::agent 类来表示异步代理。 agent 是一个声明虚拟方法 Concurrency::agent::run 的抽象类。 run 方法执行代理所执行的任务。 由于 run 是抽象的,所以您必须在从 agent 派生的每个类中实现此方法。

代理生命周期

代理具有设定的生命周期。 Concurrency::agent_status 枚举定义代理的各种状态。 下图是一个状态图,它演示了代理如何从一种状态进入另一种状态。 在此图中,实线表示您从应用程序调用的方法;虚线表示从运行时调用的方法。

代理状态图

下表描述了 agent_status 枚举中的每种状态。

代理状态

说明

agent_created

尚未计划代理的执行。

agent_runnable

运行时正在计划代理的执行。

agent_started

代理已启动并正在运行。

agent_done

代理已完成。

agent_canceled

代理在进入 started 状态之前已被取消。

agent_created 是代理的初始状态,agent_runnableagent_started 是活动状态,agent_doneagent_canceled 是最终状态。

使用 Concurrency::agent::status 方法检索 agent 对象的当前状态。 尽管 status 方法是并发安全方法,但是当 status 方法返回时,代理的状态可能会发生变化。 例如,调用 status 方法时代理可能处于 agent_started 状态,但是,在 status 方法返回后,代理可能会进入 agent_done 状态。

方法和功能

下表显示了属于 agent 类的某些重要方法。 有关所有 agent 类方法的更多信息,请参见 agent 类

方法

说明

start

计划 agent 对象的执行,并将它设置为 agent_runnable 状态。

run

执行要由 agent 对象执行的任务。

done

使代理进入 agent_done 状态。

取消

如果代理未启动,则此方法将取消执行代理,并将代理设置为 agent_canceled 状态。

status

检索 agent 对象的当前状态。

wait

等待 agent 对象进入 agent_doneagent_canceled 状态。

wait_for_all

等待所有提供的 agent 对象进入 agent_doneagent_canceled 状态。

wait_for_one

等待至少一个提供的 agent 对象进入 agent_doneagent_canceled 状态。

创建代理对象后,调用 Concurrency::agent::start 方法来计划它的执行。 运行时在计划代理之后调用 run 方法,并将代理设置为 agent_runnable 状态。

运行时不会管理异步代理引发的异常。 有关异常处理和代理的更多信息,请参见并发运行时中的异常处理

示例

有关演示如何创建基于代理的基本应用程序的示例,请参阅演练:创建基于代理的应用程序

请参见

概念

异步代理库