延迟等待

本节内容可参考示例文件"CaseStudy\异步函数.Table"。

前面的示例代码,都是用Await等待异步函数执行结束并获得返回值(如果有的话)。

Await会导致函数停止运行,释放控制权,直到异步函数运行结束,才获得控制权继续执行后面的代码。

有时这是浪费时间,何不在等待的同时继续运行后面的代码,直到需要的时候再用Await获得异步函数的返回值呢?

或者要执行多个异步函数,如果一个接一个等待,既浪费时间也失去了异步的意义,为何不同时执行所有异步函数,最后再统一等待呢?

可以的,使用延迟等待即可。

示例

新建一个自定义函数ComputeAsync,代码为:

'''Async
Dim
sum As Long
Dim
task1 = Functions.ExecuteAsync("SumAsync") '调用异步函数,没用Await
Dim
task2 = Functions.ExecuteAsync("TotalAsync") '调用异步函数,没用Await
'
不用等异步函数结束,继续进行其他计算
Dim
max As Long = Functions.Execute("Max", 100, 200, 800) '这是一个同步函数
For
m As Integer = 1 To 5000
   
For i As Integer = 0 To 1000000
        sum = sum + i
   
Next
Next
Dim
val1 As Long = Await task1 '等第一个异步函数结束并取返回值
Dim
val2 As Long = Await task2 '等第二个异步函数结束并取返回值
sum = sum + max + val1 + val2

Return
sum

然后在命令窗口执行代码:

'''Async
Dim
result As Long = Await Functions.ExecuteAsync("ComputeAsync")
Return
result

如果不采用延迟等待(即一个接一个地 Await),总耗时将是三个任务(SumAsync + TotalAsync + ComputeAsync)耗时的总和,而采用延迟等待可以让它们并行执行,大幅缩短总等待时间。


本页地址:http://www.foxtable.com/webhelp/topics/6364.htm