【问题标题】:Displaying progress for a long running process显示长时间运行的进程的进度
【发布时间】:2013-05-05 19:32:25
【问题描述】:

我在我的网站上添加了一个备份任务,它执行的任务列表可能需要很长时间。

为了提供用户反馈,我有一个带有两个 iframe 的主页。

第一个 iframe 有一个按钮,在单击按钮后执行备份(因此页面发布一分钟或更长时间)。在运行过程中,每完成一个步骤都会更新一个会话变量。

我在这个页面上有第二个 iframe,在那个 iframe 里面有一个 ASP.NET 页面,它在标签上显示进度会话变量。

问题在于,只有在第一个 iframe 中的所有步骤都完成后,第二个 iframe 才会刷新。这种行为在我的 ASP.NET 开发环境中以及部署到 IIS 时都是相同的。

当会话变量更新时,我该怎么做才能使第二个 iframe 刷新?

【问题讨论】:

    标签: asp.net progress


    【解决方案1】:

    这种行为是因为会话锁定了整个进程,并且在您进行备份时锁定了您的其余用户。

    找到其他地方来存储进程,而不是会话。如果您的池仅与一个应用程序一起运行,您可以尝试将其存储在静态变量中,如果您有网络花园,另一种解决方案是将该变量存储在数据库中,或者存储在带有其他变量的 xml 文件中。

    您还需要从禁用会话的页面运行备份!

    关于会话锁:
    Web app blocked while processing another web app on sharing same session
    jQuery Ajax calls to web service seem to be synchronous
    ASP.NET Server does not process pages asynchronously
    Replacing ASP.Net's session entirely

    【讨论】:

    • 非常感谢。禁用这些页面上的会话并从其他地方读取数据具有预期的效果。
    【解决方案2】:

    ASP.NET 会话状态支持单写多读。

    在整个操作期间,第一个 iframe 对会话状态具有写入器锁定。 因此,在操作完成之前,第二个 iframe 无法从会话中读取。

    也许更新/读取您在数据库或应用程序状态中的状态?

    A non-locking in-process ASP.NET session state store

    【讨论】: