以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  关于异步函数列队执行的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=191961)

--  作者:爱好所有
--  发布时间:2024/5/19 9:17:00
--  关于异步函数列队执行的问题
请问各位大佬,有一个资料生成项目,客户填好信息后提交在服务器上生成好打印资料并提供下载,现在有一个问题就是不使用异步的话,生成资料时就会让服务器卡死,但使用异步又不进行排队执行就会出错。现在我用的是一个低级方法,代码如下:

图片点击可在新窗口打开查看此主题相关图片如下:1.jpg
图片点击可在新窗口打开查看
以上代码也能解决问题,但感觉会出问题。

我想问的是有没有一种方法可以为生成资料单开一个子线程,然后有客户提交信息后在这个子线程里进行排队生成,这样就不会让服务器卡死了,生成资料也不会出错了。

--  作者:有点蓝
--  发布时间:2024/5/19 20:19:00
--  
具体要做什么功能,以及异步函数完整代码发上来看看
--  作者:爱好所有
--  发布时间:2024/5/20 21:07:00
--  
就是用EXCEL模板和WORD模板生成资料,上面的其他代码就是EXCEL模板和WORD模板的生成代码,没有什么特别的地方。如果用异步函数AsyncExecute生成在生成的时候就会出错,如果不改任何代码变成Execute生成就不会出错。
我主要想要的是有没有一种方法可以为生成资料单开一个子线程,然后有客户提交信息后在这个子线程里进行排队生成,这样就不会让服务端狐表卡死了,生成资料也不会出错了。
或者其他方式实现不阻塞主线程进行EXCEL模板和WORD模板的生成。当然不用排队可以同时进行EXCEL模板和WORD模板的生成又不影响主线程就是最好的图片点击可在新窗口打开查看
我上面的代码就是用异步函数AsyncExecute生成的,用的方法就是不断查询是否有一条数据正在生成资料,如果有就暂停子线程10秒循环100次。我想问问有没有更好方法实现这个功能。
[此贴子已经被作者于2024/5/20 21:24:08编辑过]

--  作者:有点蓝
--  发布时间:2024/5/20 22:07:00
--  
如果只是执行sql,异步不会有任何问题。肯定是使用了不该用的:http://www.foxtable.com/mobilehelp/topics/277.htm
--  作者:爱好所有
--  发布时间:2024/5/21 11:50:00
--  
蓝版,再问下生成WORD模板和excel模板的代码在同一时间有10次用异步方式调用(不考试代码问题),能不能正常用模板生成文件?我想确定方向对不对。
[此贴子已经被作者于2024/5/21 11:55:21编辑过]

--  作者:有点蓝
--  发布时间:2024/5/21 11:53:00
--  
我也不知道,因为不清楚模板底层的处理模式。这个建议自己测试,但是根据office的尿性,估计多个进程同时访问同一个文档是会有问题的
--  作者:爱好所有
--  发布时间:2024/5/21 12:48:00
--  
我测试过同一时间多次异步调用生成函数要出错,所以又回到第一条贴子上的问题了,有没有办法让子线程进行排队?我上面代码是用的暂停子线程的方法,解决同一时间多次异步调用生成函数的问题,但总觉得会出问题,所以问问有没有更好的办法解决子线程排队执行的方法。
[此贴子已经被作者于2024/5/21 12:48:29编辑过]

--  作者:有点蓝
--  发布时间:2024/5/21 13:41:00
--  
可以结合同步函数:http://www.foxtable.com/mobilehelp/topics/3270.htm,下面是一个例子

定义全部变量,用于处理执行次数
Public _n as Integer

异步函数
Sleep(10000) \'等待10秒,模拟各种业务处理
Functions.BeginSyncExecute("同步函数") \'调用同步函数

同步函数
_n -= 1
If _n > 0 Then
    Functions.AsyncExecute("异步函数") \'调用异步执行下一个任务
End If

按钮
_n = 5 \'定义执行5次
Functions.AsyncExecute("异步函数")

[此贴子已经被作者于2024/5/21 13:42:25编辑过]

--  作者:爱好所有
--  发布时间:2024/5/25 10:06:00
--  
谢谢蓝版,用此方法确实解决了问题。