【问题标题】:Asp.net commands still running ? but why?Asp.net 命令仍在运行?但为什么?
【发布时间】:2012-01-01 20:07:44
【问题描述】:
我有这种情况:
当 a.aspx 加载时 - 我按下按钮 1。
问题来了:
按下按钮 1 后 - 我关闭浏览器。
long work 现在会发生什么?
我猜它还在继续……
但问题是为什么?
Long工作不知道他的主要祖先线程被终止了吗?
事实上他父亲的线程也被终止了(b.aspx线程)
long func 与 b.aspx / a.aspx 之间是否存在任何关系?
【问题讨论】:
标签:
asp.net
.net
sql-server-2005
【解决方案1】:
当您打开一个 WebRequest 以访问 b.aspx 时,您实际上是在为该页面创建一个 HTTP GET。 B.aspx 对 a.aspx 的线程一无所知。但是,当您关闭浏览器时,从浏览器到 Web 服务器(运行您的按钮单击处理程序)的 HTTP 通道将终止。但是,Web 服务器不会立即注意到这一点,响应您的 click 事件的线程会继续等待 b.aspx WebRequest 完成并最终等待您长时间运行的 b.aspx 呈现,直到服务器超时结束。
【解决方案2】:
服务器仅在完成按钮1_Click 功能时才会停止,即使您关闭也是如此。
关闭浏览器时线程并没有终止,服务器只知道你发出了运行button1_Click函数的请求,不知道浏览器是否还在运行。
【解决方案3】:
据我所知,您的按钮点击和您的 b.aspx 页面之间没有隐含的关系。为了取消长时间运行的线程,您需要将某种标识符立即返回给您的 click 方法。您还需要检测浏览器的关闭(大约 5 年前我最后一次尝试它时并非在所有浏览器中都可能)。然后,您需要使用先前返回的标识符以某种方式取消该“请求”。
在我看来 b.aspx 确实应该是一个 Web 服务,但您仍然需要弄清楚如何取消“进行中”的请求。
没有办法做到这一点。不过,这听起来确实像是一个有趣的“开发者日”:)
【解决方案4】:
当您关闭浏览器或导航到新页面时,TCP 连接会关闭,但这本身不会导致关联的线程终止。
在开始长时间运行的活动之前,您可以通过检查this.Response.IsClientConnected 查看 TCP 连接是否仍然存在。您还可以将长期运行的活动分解为多个较小的块,并在每个块之间检查IsClientConnected。