111,092
社区成员




现在有个运算量很大的后端C#方法,大概要执行5分钟,这种情况下应该如何设计代码呢?
看了网上资料说是后端先开一个线程,开始执行这个方法,
然后呢,前端隔2秒钟去查询这个线程的执行情况,有没有运算完成,
-----------
不知道这种思路是否靠谱,我记得IIS会自动回收线程的.另外,就算线程没回收,后面查询进度的方法,如何定位特定的线程呢,难道把线程放进 HttpRuntime.Cache ?
请指教
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模式提交给其他系统执行
开启线程后,就先responce前端,不等线程执行完再返回前端消息的,
没必要,这个线程自己不停改变某个静态变量,把这个变量显示到前台界面上就行了,这样你就知道它有没有一直在运行了。
IIS?浏览器可不会等你5分钟哦