Delphi 在新版中引入了一个新的异步编程模型,一个新的接口 IAsyncResult 被包含在 System.Types 里。我们先来大概说下 Delphi 自己这个异步编程模型的思路:
1、异步编程的函数名,官方是以 BeginXXX打头,比如 BeginReceive、BeginWrite 等等 ,它们负责开始一个异步调用,并且返回一个 IAsyncResult 类型的接口,方便上层控制异步过程。
2、开启的异步调用过程,完成了会调用你提供的 TAsyncCallback/TAsyncCallbackEvent 异步回调函数。如果不需要,可以不提供。
3、可以使用 EndXXX 来强制结束一个异步调用过程,如果 EndReceive、EndWrite 等等。EndXXX 系列函数会等待异步调用完成,然后才返回。也就是说,如果一个异步调用开启,要等待它完成的话,可以调用 EndXXX 来操作。
4、开启的异步调用过程,可以使用 IAsyncResult.Cancel 来取消调用,但是要注意不是所有的异步操作都支持取消的,所以这个接口可能返回 false。所以,如果一个异步调用过程取消失败的话,调用 EndXXX 来等待结束退出才是安全的,否则可能会有问题。
嗯,基本的流程就是这个样子:Starter.BeginXXX->回调或Starter.EndXXX或IAsyncResult.Cancel。
从上面的流程就可以分配出,Delphi 自带的异步编程模型有两部分组成:
1、服务端提供异步调用支持的实现,它要实现支持 IAsyncResult 接口的支持,并提供 BeginXXX/EndXXX 系列函数。
2、调用端按上面说的完成标准的调用过程。BeginXXX 返回的结果实例一般情况下需要保存,以便在对象释放之前,中止异步操作,避免访问违例。除非你确认异步调用的内部操作与当前调用的实例没有关系,否则安全起见,还是要慎重。
IAsyncResult 的实现可以继承自 TBaseAsyncResult,它位于 System.Classes 单元。客户端如果要在中间判断执行的结果,可以通过这个接口来实现:
- AsyncContext 是用户 BeginXXX 传入的关联对象实例
- AsyncWaitEvent 是内部用来等待作业完成的事件实例,用户可以通过它等待多个事件或其中一个完事
- CompletedSynchronously 用来标志是否异步调用能同步完成,换句话说,具体的调用可能返回前已经完成
- IsComplete 用来标志异步调用是否完成
- IsCancel 用来标志异步调用是否被取消
好了,本文到此结束,可以看到异步编程还是需要比较多的说道的。
此行以下无正文。