Foxtable(狐表)用户栏目专家坐堂 → 自动等待异步函数执行请教


  共有287人关注过本帖树形打印复制链接

主题:自动等待异步函数执行请教

帅哥哟,离线,有人找我吗?
z769036165
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:758 积分:5408 威望:0 精华:0 注册:2012/10/5 21:53:00
自动等待异步函数执行请教  发帖心情 Post By:2024/5/25 19:22:00 [只看该作者]

我想实现在内部函数A中执行异步执行10次函数B,然后在函数A等待10次函数B全部完成,才执行后续的代码,我参考下面的,是B中同步执行C函数,但是这有个问题,就是没办法回到A了,A里面有大量关联数据,参数,需要在后面去执行,这个有什么办法?


自动等待异步函数执行完毕

作为一个面向非专业人士的开发平台,Foxtable并未提供等待异步函数执行完毕的功能,实际开发过程中也少有此种需要发生。
如果你确实需要在全部异步函数执行完毕后,自动执行特定的代码,可以参考下面的代码。
继续以前面的异步累加为例:

1、定义Public变量

首先我们在全局代码中定义一个Public变量:

Public Total As Integer
Public
 TCount As Integer

我们在这里增加了一个计数器变量TCount。

2、定义同步函数

定义一个名为AddTotal的函数,其代码为:

Total = Total + Args(0)
TCount
  = TCount - 1
If
 Tcount = 0 Then
    MessageBox.Show("计算完成,结果为:" & Total)

End
 If

这个函数将在异步函数中被同步调用,用于累加各异步函数产生的结果。

3、定义异步函数

然后定义一个名为AddSubtotal的函数,这个函数将在主线程中被异步调用,其代码为:

Dim Sum As Integer
For 
As Integer = 1 To 100
    
Sum = Sum + 1
Next

Functions 
.BeginSyncExecute("AddTotal",Sum'调用同步函数AddTotal累加结果

4、测试结果

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

Total = 0
TCount
 = 100
For
 i As Integer = 1 To TCount
    
Functions.AsyncExecute("AddSubtotal")
Next

原理很简单,TCount变量的初始值为100,表示异步函数要调用100次,每次异步函数(AddSubtotal)执行完毕后,都会调用同步函数(AddTotal),此函数每执行一次,就将TCount减1,当TCount的值等于0,表示所有的100个异步函数都执行完毕了。


 回到顶部
帅哥哟,离线,有人找我吗?
z769036165
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:758 积分:5408 威望:0 精华:0 注册:2012/10/5 21:53:00
  发帖心情 Post By:2024/5/25 19:24:00 [只看该作者]

目前想到就是在A函数用Do Loop 一直去循环检测TCount 是否等于 0,还有更好的办法吗?

 回到顶部
帅哥,在线噢!
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107672 积分:547681 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/5/26 19:42:00 [只看该作者]

把函数A拆分为2个函数:函数A1、函数A2

函数A1调用异步,第10次函数B执行完毕后,调用同步函数的时候,在同步函数里调用函数A2

 回到顶部
帅哥哟,离线,有人找我吗?
z769036165
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:758 积分:5408 威望:0 精华:0 注册:2012/10/5 21:53:00
  发帖心情 Post By:2024/5/27 14:01:00 [只看该作者]

但是A函数很多参数,那这样都得传递到异步函数里面,这样异步函数里面才能同步传到A2才行啊?这样大量循环,传很多参数实际在异步中不用的参数不会有影响?

 回到顶部
帅哥,在线噢!
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107672 积分:547681 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/5/27 14:08:00 [只看该作者]

参数多少不是问题。要传递的什么参数,如果是异步不能使用的东西,比如直接传窗口控件,肯定是不行的,这种情况考虑把窗口名称和控件名称传递过去

 回到顶部