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 效果。