[教程]ZAsync 异步编程之六:在主线程中使用async/await

async/await 是一种协同式的异步执行机制,它要求长时间执行的作业,主动去释放当前线程的控制权,从而让其它同一线程的函数获得执行机会,从而充分利用CPU资源。

要在你的程序中支持 async/await 模式,需要 :

1、引用 zbar.async 和 vcl.zbar.async/fmx.zbar.async 单元(这两个单元取决于你具体使用的框架,主要用于支持在主线程中使用 async/await)。

2、执行TZAsync.Async(匿名函数,[附加参数列表]) 即可启动一个当前线程的异步调用,当遇到 await 或者用户调用 TZAsync.Yield 时,异步调用会被触发执行。主线程中的 async 调用会 TZAsync 在消息循环空闲时自动调用了 TZAsync.Yield,所以可以不需要调用,但在后台线程中,因为 TThread 本身作者并没有找到直接注入的地方,所以需要用户手动调用 Yield 来触发。

3、执行TAsync.Await(匿名函数,[附加参数列表]) 即可启动一个当前线程的异步调用,并且等待它完成。

在回调函数中,使用 IZAsyncInvoker 或 TZAsync 的 Yield 可以让出当前函数执行权到下一个函数。请看下面的例子:

procedure TForm2.Button1Click(Sender: TObject);
begin
  TZAsync.Async(
    procedure(AInvoker: IZAsyncInvoker)
    begin
      ShowMessage('Hello,async first');
      AInvoker.Yield;
      ShowMessage('Hello,async second');
    end);
  ShowMessage('Hello,first');
  TZAsync.Await(
    procedure(AInvoker: IZAsyncInvoker)
    begin
      ShowMessage('Hello,async third');
    end);
  ShowMessage('Hello,final');
end;

运行上面的例子,实际呈现提示的顺序是(截图为老版本,新版本加了 TZAsync 前缀):

  • Hello,first
  • Hello,async first
  • Hello,async third
  • Hello,async second
  • Hello,final
async/await 效果演示

达到了我们预期的 async/await 效果。

分享到: