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 可以让出当前函数执行权到下一个函数。请看下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 效果。