我有一个.NET页面,它将通过在用户单击按钮的SQL Server中调用存储过程来执行计算。通常,计算大约需要2分钟才能完成,完成后它将更新表格中的字段。现在我遇到一个问题,当用户意外关闭浏览器时,存储的proc仍将运行并更新表。我认为页面应该停止运行,停止更新表中的字段而不是继续运行,即使浏览器已关闭?任何想法如何停止过程??
答案 0 :(得分:3)
没有
服务器对浏览器是否仍处于打开状态一无所知。浏览器只会触发进程,到页面下载时,它与服务器的交互就完成了。
答案 1 :(得分:3)
当页面请求导致对数据库的调用时,页面将等待它完成,但数据库没有页面的知识。因此,如果页面因任何原因停止等待,数据库将很乐意继续工作直到完成。事实上,页面请求也没有关于浏览器是否仍然打开的知识,因此如果用户关闭浏览器,页面请求本身仍将执行直到完成。只有没人会听取结果。
答案 2 :(得分:1)
您可以使用计时器ajax调用来允许服务器确定浏览器是否仍处于打开状态且处于活动状态。
为了在发生这种情况时停止存储过程,您需要对其进行一些重大修改。唯一真正的方法是在数据库中存储一个参数,以指示存储过程应该继续运行,然后在整个存储过程中检查该参数。如果浏览器已关闭,则更新此参数,您可以根据此值更改存储过程以回滚/退出。
但是,所有这些都非常复杂,收益很小......存储过程是否继续运行存在问题?
答案 3 :(得分:0)
如果您需要支持某种形式的取消,您需要对您的asp.net页面和计算进行一些更改。您的计算必须寻找一个标志(可能在存储结果的同一个表中)。
然后,在您的代码中,您需要异步启动过程执行。现在,为了干净利落,你真的需要整个页面进行异步处理,并定期唤醒,检查Request.IsClientConnected,如果它们不再连接,设置标志取消计算。
这是一项相当大的工作,很容易出错。此外,您实现此策略的策略会有很大差异,具体取决于您的应用程序是需要支持10个用户还是数千个用户(您是否在.Net线程池中睡眠,从而限制了应用程序的可伸缩性,或者有专用线程来轮询IsClientConnected属性,并计算出哪些计算中止?)