运行长时间运行的存储过程(这并不需要返回)从ASP.NET页(Run long-running sp

2019-10-21 00:40发布

我想知道你将如何从一个页面运行存储过程,只是“让它完成”,即使页面被关闭。 它并不需要返回任何数据。

Answer 1:

以数据库为中心的办法是:

  • 创建长时间运行的作业将包含一个列表(或队列)的表来执行。
  • 有应用程序条目是否,何时,并根据需要添加到队列中。 这就是它所做的一切; 一旦登录后进入,没有Web会话或状态数据需要维护。
  • 已配置了检查每1,2,5,无论分钟,看看是否有任何作业运行SQL代理作业。
  • 如果有作为,但尚未启动的项目,标志着最近的一次为开始,并启动它。
  • 当它完成后,将其标记为已完成,或者删除它
  • 检查是否有任何其他项目运行。 如果有,重复; 如果没有,退出工作。

根据容量,你可以有这个工作运行的几种(名称不同)的副本,同时处理来自列表中的项目。

(我用这个方法非常长时间运行的方法。这是更大的管理型的把戏,但它可能是适合您的情况。)



Answer 2:

首先准备命令,接着在线程池对其进行排队。 只需确保线程不依赖于任何HTTP上下文或任何其他HTTP内部对象。 如果您的请求的线程之前完成; 上下文可能会消失。



Answer 3:

见异步程序执行 。 这是保证即使ASP进程崩溃执行的唯一方法。 它也自我调整,可以处理负载的峰值,请求正在排队和处理资源可用。

该解决方案的要点是借力SQL服务器激活的概念,它允许你运行在SQL Server中的后台线程的存储过程无需客户端连接

基于非同步的SqlClient方法或CLR线程池的解决方案是不可靠的,因为ASP进程被回收的呼叫丢失,此外,他们建立在内存中,实际上触发过程再循环由于内存消耗请求的队列。

基于表和代理作业解决方案是更好的,因为它们是可靠的,但他们缺乏基于激活解决方案的自调整。



文章来源: Run long-running sproc (that doesn't need to return) from ASP.NET page