取消长时间运行的IFRAME

时间:2015-04-06 20:55:46

标签: asp.net sql-server iframe cancellation long-running-processes

我有一个ASP.NET WebForm应用程序 - 一个托管一堆IFRAME"小部件"的主页面。当主页加载时 - 小部件'页面也加载并开始自己的处理,包括连接到SQL Server以运行存储过程。

如果用户需要,取消那些IFRAME处理的最佳方法是什么?我可以将他们的SRC从客户端设置为另一个/空白页面,从而取消请求,但如果IFRAME页面已经调用SQL Server - 我如何取消SQL处理呢?

编辑:为了澄清IFRAMEd页面中最慢的点是SQL Server存储过程调用,所以基本上归结为 - 我可以从客户端开始取消SQL命令吗?

1 个答案:

答案 0 :(得分:2)

我想到的一个解决方案是拥有静态List当前正在运行SqlCommands ,每当用户调用取消时,您都可以从此静态列表中提取命令,然后取消它。正在执行该命令的页面将收到命令取消异常,然后它可以正确处理它。

以下是您需要处理的事项:

  1. 以某种方式用户界面应该有一些键,这样当你按下取消按钮时,用户界面会将该键发送到取消例程,取消例程将使用该键提取SqlCommand并调用它{ {1}}方法。
  2. 取消电话应通过AJAX
  3. 完成
  4. 应为线程安全进行正确锁定
  5. <强>更新

    我在这里添加一些细节,

    1. 以下是项目http://goo.gl/noKUmj
    2. 的链接
    3. 以上项目是Web表单应用程序
    4. 您可以在此项目中添加任意数量的控制器,路由代码已添加到Cancel中,因此新控制器应该可以正常工作
    5. 但是对于新的IFRAME取消,您不必添加另一个控制器。您只需将Global.ascx(作为密钥)传递给Cancel Controller
    6. 即可
    7. 限制:此项目有限制,如果您点击IFRAME的取消按钮,它将取消所有当前请求,这意味着在多用户环境中,如果一个用户取消IFRAME-1,所有IFRAME-1将被其他所有用户取消。
    8. 您可以轻松取消多个IFRAME,因为您可以看到它正在执行JavaScript代码的取消按钮代码,您只需要在一次点击中调用多个取消代码。
    9. 正如您可能已经看过该项目一样,它使用PageName作为密钥从PageName中提取SqlCommand。因此,我们有上述限制。由于多个List的{​​{1}}会相同。

      要克服此限制,您可以生成PageName作为密钥,并将SqlCommand中的GUID传递到GUIDQueryString页面,以便它们使用这些Form1.aspxForm2.aspx中添加命令。这些密钥应该在主机页面呈现时或在JavaScript中生成。

      如果您不想使用RnD,则此处是使用List作为密钥的更新项目。 :) http://goo.gl/I86S7Z