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