• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

大运算量方法的处理方式

leeya66 2021-07-24 22:36:46

现在有个运算量很大的后端C#方法,大概要执行5分钟,这种情况下应该如何设计代码呢?

看了网上资料说是后端先开一个线程,开始执行这个方法,

然后呢,前端隔2秒钟去查询这个线程的执行情况,有没有运算完成,

-----------

不知道这种思路是否靠谱,我记得IIS会自动回收线程的.另外,就算线程没回收,后面查询进度的方法,如何定位特定的线程呢,难道把线程放进  HttpRuntime.Cache ?

 

请指教

...全文
191 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复

5分钟,对于用户来说时间太长,你觉得人家会老老实实等你5分钟?
异步处理这个慢操作。
不需要等处理完成,立即提示前端,已经在处理了,请在大概10分钟之后重新查看这个页面。

如果你要完成了立即通知前端,可以用 SignalR 或 WebSocket 。

不过总体上来说,还是太复杂了。能立即显示给用户才是最好的解决方案。
如果你后台的操作,是报表之类的,可以凌晨生成,用户查看时,给用户看结果表,那就这样处理吧。

回复

把结果存起来就行啊,为什么要定位到特定的线程

回复

这是典型的异步,所以我们换方式来说。
假设这是一个支付场景

你进入支付以后,转账给第3方,然后第3方给你确认。那么现在的实现方式是什么?
很明显,这种情况下,你需要先生成一个订单流水,然后把订单流水号和转账金额提交给第3方,接着等待第3方给个确认,然后你提示页面支付成功。

那么你这里情况一样,我们先不谈啥iis机制,我就当这是一个普通程序,你提交一个执行,我开启生成一个guid 同时开启task,同时放到一个dic<guid,task>里,然后就返回结束response,此时页面会得到找个guid流水号,你的前端应该有得到这个guid号

假设我们也不用什么websocket,singlaR,activemq,mqtt这种推送方式,你就用ajax轮询,你定时轮询找个guid的结果,
当然只需要 dic[guid].isComplete 就可以得知执行是否结束

在回头我们看看如果采用activemq,mqtt这种消息通讯的情况,拿到guid,订阅“xxx执行结果/guid” topic呢,其实也行

最后我们在来看,我们是否需要在iis里dic<guid,task>,,当然其实也可以不在iis里做(最起码的例子,你调用支付宝的接口,他这个耗时执行是在支付报里完成),所以这里衍生出了分布式任务,用mq提交给其他系统执行,用spark,storm提交给其他地方执行,用actor模式提交给其他系统执行

回复
leeya66 07-26
@wanghui0380 dic<guid,task> 这个要放进缓存吧?
回复
@leeya66 我们只是描述,你可以如何想,如何做。不拘泥技术。你无需管啥缓存还是不缓存。他可以是任意适合的东西。比如就像最后那回复,他可以在数据库里,当然也可以在redis里。甚至都可以不在你现在这个iis里,比如你发给你一个不在iis里的后台程序做可以么?当然可以,甚至他都可以做完了不通知你直接用activemq,mqtt通知client也行,或者你说做完了让我发个短信通知对方也成。(看看你的银行转账不就这样,你转账的时候,银行怎么说?银行说我不确定时间,反正24小时内,但是转账成功了会发给你短信,比较一下你现在要做的和银行转账的说法一样不,当然一样,我不确定他会执行多长时间,反正5分钟内,做完了我会通知你)
回复 1
leeya66 07-25

开启线程后,就先responce前端,不等线程执行完再返回前端消息的,

回复

没必要,这个线程自己不停改变某个静态变量,把这个变量显示到前台界面上就行了,这样你就知道它有没有一直在运行了。

回复

IIS?浏览器可不会等你5分钟哦

回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2021-07-24 22:36
社区公告

让您成为最强悍的C#开发者