异步代理

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

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

代理生命周期

代理具有固定的生命周期。 concurrency::agent_status 枚举定义代理的各种状态。 下图是一个状态图,显示代理如何从一个状态发展到另一个状态。 在此图中,实线表示从应用程序调用的方法;虚线表示从运行时调用的方法。

Agent State Diagram.

下表描述了 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 状态。
cancel 如果未启动代理,则此方法将取消代理的执行,并会将其设置为 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 方法来计划它的执行。 运行时在计划代理并将其设置为 agent_runnable 状态后调用 run 方法。

运行时不管理由异步代理引发的异常。 有关异常处理和代理的详细信息,请参阅异常处理

示例

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

另请参阅

异步代理库