异步代理
异步代理(或简称为代理)是一个应用程序组件,它与其他代理异步工作以解决大型计算任务。 将代理视为具有固定生命周期的任务。 例如,一个代理可能会从输入/输出设备(例如键盘、磁盘上的文件或网络连接)读取数据,而另一个代理可能会在该数据可用时对其执行操作。 第一个代理使用消息传递来通知第二个代理有更多数据可用。 并发运行时任务计划程序提供了一种高效的机制,可以使代理协同阻止和暂停,而无需低效率的抢占。
代理库定义了 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 类。
方法 | 说明 |
---|---|
start | 计划 agent 对象的执行,并将对象设置为 agent_runnable 状态。 |
run | 执行要由 agent 对象执行的任务。 |
done | 将代理转变到 agent_done 状态。 |
cancel | 如果未启动代理,则此方法将取消代理的执行,并会将其设置为 agent_canceled 状态。 |
status | 检索 agent 对象的当前状态。 |
wait | 等待 agent 对象进入 agent_done 或 agent_canceled 状态。 |
wait_for_all | 等待所有提供的 agent 对象进入 agent_done 或 agent_canceled 状态。 |
wait_for_one | 等待至少一个提供的 agent 对象进入 agent_done 或 agent_canceled 状态。 |
创建代理对象后,调用 concurrency::agent::start 方法来计划它的执行。 运行时在计划代理并将其设置为 agent_runnable
状态后调用 run
方法。
运行时不管理由异步代理引发的异常。 有关异常处理和代理的详细信息,请参阅异常处理。
示例
有关如何创建基于代理的基本应用程序的示例,请参阅演练:创建基于代理的应用程序。