异步代理(或只称作代理)是以异步方式与其他代理一起解决更大的计算任务的应用程序组件。 将代理看作具有设定的生命周期的任务。 例如,一个代理可能会从输入/输出设备(如键盘、磁盘上的文件或网络连接)中读取数据,另一个代理可能会在数据变得可用时对该数据执行操作。 第一个代理通过消息传递来通知第二个代理有更多数据可用。 并发运行时任务计划程序提供了一个高效的机制,使代理能够以协作方式进行阻止和退出,而无需进行效率低下的抢占。
代理库定义了 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_runnable 和 agent_started 是活动状态,agent_done 和 agent_canceled 是最终状态。
使用 concurrency::agent::status 方法来检索当前状态的agent对象。 尽管 status 方法是并发安全方法,但是当 status 方法返回时,代理的状态可能会发生变化。 例如,调用 status 方法时代理可能处于 agent_started 状态,但是,在 status 方法返回后,代理可能会进入 agent_done 状态。
下表显示了属于 agent 类的某些重要方法。 有关所有 agent 类方法的更多信息,请参见 agent 类。
方法 | 说明 |
---|---|
计划 agent 对象的执行,并将它设置为 agent_runnable 状态。 | |
执行要由 agent 对象执行的任务。 | |
使代理进入 agent_done 状态。 | |
如果代理未启动,则此方法将取消执行代理,并将代理设置为 agent_canceled 状态。 | |
检索 agent 对象的当前状态。 | |
等待 agent 对象进入 agent_done 或 agent_canceled 状态。 | |
等待所有提供的 agent 对象进入 agent_done 或 agent_canceled 状态。 | |
等待至少一个提供的 agent 对象进入 agent_done 或 agent_canceled 状态。 |
创建代理对象后,调用 concurrency::agent::start 以安排执行的方法。 运行时在计划代理之后调用 run 方法,并将代理设置为 agent_runnable 状态。
运行时不会管理异步代理引发的异常。 有关异常处理和代理的更多信息,请参见并发运行时中的异常处理。