打开System.Classes单元,进一步查看这两个方法,会看到BeginInvoke方法重载几个版本:
functionBeginInvoke(const AProc: TProc; const AContext: TObject = nil):IAsyncResult; overload;
functionBeginInvoke(const AProc: TASyncProcedureEvent; const AContext:TObject = nil): IAsyncResult; overload;
functionBeginInvoke(const AFunc: TFunc; const AContext: TObject = nil):IAsyncResult; overload;
functionBeginInvoke(const AProc: TAsyncConstArrayProc; const Params: arrayof const; const AContext: TObject = nil): IAsyncResult;overload;
functionBeginInvoke(const AFunc: TAsyncConstArrayFunc; const Params: arrayof const; const AContext: TObject = nil): IAsyncResult;overload;
functionBeginInvoke(const AProc: TAsyncConstArrayProcedureEvent; constParams: array of const; const AContext: TObject = nil):IAsyncResult; overload;
functionBeginInvoke(const AFunc: TAsyncConstArrayFunctionEvent; constParams: array of const; const AContext: TObject = nil):IAsyncResult; overload;
functionBeginInvoke(const AFunc: TAsyncFunctionEvent; const AContext:TObject = nil): IAsyncResult; overload;
这些重载的版本,都返回接口IAsyncResult。参数是过程变量,也就是我们要异步执行的方法,按Help中的说明,执行一个异步调用,一定要用EndInvoke来结束异步调用。具体来说,就是用BeginInvoke方法返回的IAsyncResult来结束,EndInvoke(IAsyncResult)。
结合上面的内容,实作一个例子:
1.建立一个要异步调用的方法:
procedure TForm5.testAsync(const ASyncResult: IAsyncResult);
begin
sleep(1000*10);//这里实现具体的业务逻辑
EndInvoke(ASyncResult);//中止异步调用
end;
2.异步执行这个方法:
BeginInvoke(testAsync);
这个例子,我们在异步执行的方法中直接中止异步调用。
由于我还没Update1,只是读Xe8带的这两个方法,整理出来的,在xe8中测试还没有正确执行。另外,可以判定,Delphixe8就开始实现异步调用,只是没有做好,所以在Update1中才说明为新增加的内容。
此外,关于这个异步调用,完全是照搬C#中的实现方式。
![DelphiXE8异步编程 delphixe8](http://img.413yy.cn/images/31101031/31044927t01d52d73565169a1cb.png)
后记:用Update1测试,也没有异步执行,有朋友说是不是Sleep的问题,我换成其他的逻辑,也没能通过。