延迟等待
本节内容可参考示例文件"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)耗时的总和,而采用延迟等待可以让它们并行执行,大幅缩短总等待时间。