微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

首页> C#>如何处理长的AJAX请求-发送响应但继续工作

我们正在使用jquery-ajax将指令集从浏览器发送到多层Web应用程序中.第一个组件(用C#编写的组件A)验证指令并将其持久保存到数据库中,然后调用第二个组件(用Java编写的组件B,也通过HTTP调用),该组件在从同一条指令中检索指令后对其进行操作数据库.浏览器客户端在提交作业后仅通过组件A轮询rdbms表,因此在发送请求后它实际上已断开连接,并且不等待组件A的响应.

中间层(组件A)向客户端返回成功消息以确认任务已成功提交的最佳方法是什么,然后仍然向任务处理程序(组件B)发出请求并释放其所有资源, ?返回响应是该页面的最终操作,因此我们必须在另一个线程中执行一些操作,然后再将其发送回浏览器.

我们考虑过的另一种选择是在组件B中发生,在该组件中,任务处理程序将立即响应发送回中间层以确认请求,然后继续在后台工作.唯一的区别是我们在哪里生成其他线程来完成工作.

关于如何处理此问题有什么好主意吗?

解决方法:

在这种情况下,我们所做的是:

>浏览器将指令集发送到组件A
>组件A验证指令集
>组件在新的“跟踪” ID STATUS = PENDING下设置为DB的保存指令
>组件向组件B发出请求以进行工作
>“线程”在组件B中:

>组件B启动后台线程进行工作,后台线程要做的第一件事就是将“跟踪ID”的状态更新为STATUS = RUNNING
>组件B主线程返回到组件A的成功

>组件A从组件B获取“已成功启动”消息,因此将其自身的“已成功启动”消息连同“跟踪ID”返回给浏览器.在这一阶段,组件A完成了请求,所有组件A资源均已释放.
>浏览器可以对组件A进行不同的调用,以检查数据库中“跟踪ID”的状态
>同时,组件B的后台“线程”仍在工作,可能会根据“跟踪ID”记录进度
>组件B完成工作,更新DB中“跟踪ID”的状态,STATUS = OK或STATUS = ERROR,并放弃所有资源.

从您的应用程序的角度来看,所有这些的优点是无需等待工作完成.实际工作是由“后台”线程完成的,就像您使用nohup dothework& amp;在壳中.关键是使用DB监视“跟踪ID”的状态.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐