Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 即使浏览器关闭,存储的进程和程序仍在运行?_Asp.net_Sql Server - Fatal编程技术网

Asp.net 即使浏览器关闭,存储的进程和程序仍在运行?

Asp.net 即使浏览器关闭,存储的进程和程序仍在运行?,asp.net,sql-server,Asp.net,Sql Server,我有一个.NET页面,当用户单击按钮时,该页面将通过调用SQL Server中的存储过程来执行计算。通常,计算大约需要2分钟才能完成,完成后将更新表中的字段。现在我有一个问题,当用户意外关闭浏览器时,存储的进程仍将运行并更新表。我认为页面应该停止运行,停止更新表中的字段,而不是在浏览器关闭时继续运行??你知道如何停止这个过程吗?没有 服务器不知道浏览器是否仍处于打开状态。浏览器只是启动进程,在下载页面时,它与服务器的交互已经完成。当页面请求导致对数据库的调用时,页面将等待它完成,但数据库不知道该

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

没有


服务器不知道浏览器是否仍处于打开状态。浏览器只是启动进程,在下载页面时,它与服务器的交互已经完成。

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

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

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


然而,所有这些都相当复杂,几乎没有什么好处。。。存储过程继续运行是否有问题?

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

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


这是一项相当大的工作,很容易出错。此外,根据应用程序需要支持10个用户还是数千个用户,您的实现策略也会有很大的不同(您是睡在.Net线程池中,从而限制了应用程序的可伸缩性,还是有一个专用线程来轮询IsClientConnected属性,并确定要中止哪个计算?)

但据我所见,我在单击按钮后的几秒钟内关闭了浏览器,然后关闭了浏览器。同时,我检查表中的字段,它仍然没有更新,但在2分钟后,我再次检查该字段,这次是更新的。如果存储过程是事务性的,则在事务完成之前,您不会看到数据库中的更改。如果您需要查看其进度,那么可以尝试使用(nolock)。实际上,这并不重要。我只是想弄清楚到底发生了什么!但是,用于更新字段的编码不在存储的过程中,而是隐藏的代码。所以,我想知道为什么页面在完成后仍然会更新字段,即使浏览器已经关闭@WeeShian:这是因为页面请求与浏览器断开连接;请记住,页面请求在web服务器中执行,而不是在浏览器中执行。页面请求不知道浏览器是否仍处于打开状态。