[教程]ZAsync异步编程之五:IZAsyncInvoker的执行链条

ZAsync 简化了异步编程模型的设计,做了以下强制约定:

  • 异步作业执行可以在主线程或后台线程中执行
  • 异步作业执行函数退出后的操作,如果是用 async/await 调用,则其在原线程中执行,而其它后台线程的异步作业,只能在主线程中运行,以方便访问主线程界面元素,减少出错的几率。

为了方便大家了解 ZAsync 异步编程框架,我们在这里将异步调用的过程进行下说明:

  1. 因为 IZAsyncInvoker 的实现被设置为私有,所以使用时,统一通过 AsyncInvoke 函数,创建一个异步调用接口实例。此时,异步调用处于待调用状态。
  2. 为异步调用添加异步调用函数退出后的各个处理环节函数:
    – AfterSuccessed 处理链条仅在异步作业函数没有抛出任何异常,且作业没有处于取消状态时,才会被调用
    – AfterCanceled 处理链条仅在异步作业函数被取消时,才会被调用
    – AfterError 处理链条仅在异步作业函数抛出异步时被调用
    – AfterDone 处理链条在作业函数退出后被调用,而不管是否取消或出错
  3. 调用接口实例的 Invoke 方法,触发实际的异步调用。在这里指明两个参数:是否在主线程中执行异步作业以及异步作业延时(单位为毫秒)

对于在后台线程执行的异步作业,全局函数变量 AsyncThreadInvoke 保留给用户对接其它线程池,如 QWorker/OmiThreadLib 等等,如果没有对接,则 IZAsyncInvoker 会创建匿名线程来使作业在后台线程中执行。

有时候,我们希望当前的异步作业,在多个前置作业完成后,才触发执行,那么可以使用 IZAsyncInvoker 使用的 Follow 函数。该函数可以关联一到多个异步作业接口实例,对应的实例执行完成(可以只有在前述都成功时执行)时,触发自身的执行。

下图描述了 IZAsyncInvoker 的具体工作流程

IZAsyncInvoker执行流程
分享到: