即使浏览器关闭,存储过程和程序仍在运行?

时间:2009-08-20 10:18:09

标签: asp.net sql-server

我有一个.NET页面,它将通过在用户单击按钮的SQL Server中调用存储过程来执行计算。通常,计算大约需要2分钟才能完成,完成后它将更新表格中的字段。现在我遇到一个问题,当用户意外关闭浏览器时,存储的proc仍将运行并更新表。我认为页面应该停止运行,停止更新表中的字段而不是继续运行,即使浏览器已关闭?任何想法如何停止过程??

4 个答案:

答案 0 :(得分:3)

没有

服务器对浏览器是否仍处于打开状态一无所知。浏览器只会触发进程,到页面下载时,它与服务器的交互就完成了。

答案 1 :(得分:3)

当页面请求导致对数据库的调用时,页面将等待它完成,但数据库没有页面的知识。因此,如果页面因任何原因停止等待,数据库将很乐意继续工作直到完成。事实上,页面请求也没有关于浏览器是否仍然打开的知识,因此如果用户关闭浏览器,页面请求本身仍将执行直到完成。只有没人会听取结果。

答案 2 :(得分:1)

您可以使用计时器ajax调用来允许服务器确定浏览器是否仍处于打开状态且处于活动状态。

为了在发生这种情况时停止存储过程,您需要对其进行一些重大修改。唯一真正的方法是在数据库中存储一个参数,以指示存储过程应该继续运行,然后在整个存储过程中检查该参数。如果浏览器已关闭,则更新此参数,您可以根据此值更改存储过程以回滚/退出。

但是,所有这些都非常复杂,收益很小......存储过程是否继续运行存在问题?

答案 3 :(得分:0)

如果您需要支持某种形式的取消,您需要对您的asp.net页面和计算进行一些更改。您的计算必须寻找一个标志(可能在存储结果的同一个表中)。

然后,在您的代码中,您需要异步启动过程执行。现在,为了干净利落,你真的需要整个页面进行异步处理,并定期唤醒,检查Request.IsClientConnected,如果它们不再连接,设置标志取消计算。

这是一项相当大的工作,很容易出错。此外,您实现此策略的策略会有很大差异,具体取决于您的应用程序是需要支持10个用户还是数千个用户(您是否在.Net线程池中睡眠,从而限制了应用程序的可伸缩性,或者有专用线程来轮询IsClientConnected属性,并计算出哪些计算中止?)