[教程] Delphi 自带异步模型详解

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 用来标志异步调用是否被取消

好了,本文到此结束,可以看到异步编程还是需要比较多的说道的。

此行以下无正文。

分享到: